Obsługa błędów

Witam, studiuje pozycję RailsSpace i dotarłem do obsługi błędów formularza rejestracyjnego. I tu sie rodzi problem, otóż… stworzona została obługa błędów w modelu user.rb, która jest następująca:

class User < ActiveRecord::Base

  #Maksymalne i minimalne długości wszystkich pól
  SCREEN_NAME_MIN_LENGTH = 4
  SCREEN_NAME_MAX_LENGTH = 20
  PASSWORD_MIN_LENGTH = 4
  PASSWORD_MAX_LENGTH = 40
  EMAIL_MAX_LENGTH = 50
  SCREEN_NAME_RANGE = SCREEN_NAME_MIN_LENGTH..SCREEN_NAME_MAX_LENGTH
  PASSWORD_RANGE = PASSWORD_MIN_LENGTH..PASSWORD_MAX_LENGTH
  
  # Rozmiary pól tekstowych wyświetlanych w widokach
  SCREEN_NAME_SIZE = 20
  PASSWORD_SIZE = 10
  EMAIL_SIZE = 30

 #Przetłumaczone nazwy pól
 HUMANIZET_ATTRIBUTES = {
     :email => "Adres e-mail",
     :screen_name => "Pseudonim",
     :password => "Hasło",
 }
 
 #tłumaczy nazwy pól
 def self.human_attribute_name(attr)
    HUMANIZED_ATTRIBUTES[attr.to_sym] || super
 end
 
 validates_uniqueness_of :screen_name, :email, :message => "jest już zajęty!"
 validates_length_of     :screen_name, :within => SCREEN_NAME_RANGE, :too_short => "jest zbyt krótki ! (minimum to #{SCREEN_NAME_MIN_LENGTH} znaki)", :too_long => "jest za długi! (maksimum to #{SCREEN_NAME_MAX_LENGTH} znaków)"
 validates_length_of     :password,    :within => PASSWORD_RANGE, :too_short => "jest zbyt krótkie ! (minimum to #{PASSWORD_MIN_LENGTH} znaki)", :too_long => "jest za długie! (maksimum to #{PASSWORD_MAX_LENGTH} znaków)"
 validates_length_of     :email,       :maximum => EMAIL_MAX_LENGTH,   :message => "jest zbyt długi!"
 validates_format_of :screen_name,
                     :with => /^[A-ZąćęłóśźżĄĆĘŁŃÓŚŹŻ0-9_]*$/i,
                     :message => "może zawierać tylko litery, " + "cyfry i znaki podkreślenia."
 validates_presence_of   :email,       
                         :with => /^[A-Z0-9._%-]+@([A-Z0-9-]+\.)+[A-Z]{2,4}$/i,
                         :message => "musi być prawidłowym adresem email."

end

NASTĘPNIE ZOSTAŁ STWORZONY WIDOK W APP/VIEWS/USER/register.rhtml

REJESTRACJA

<% form_for :user do |form| %> Wypełnij poniższy formularz
 <div class="form_row">
 <label for="screen_name"> Pseudonim: </label>
 <%= form.text_field :screen_name, :size => User::SCREEN_NAME_SIZE, :maxlength => User::SCREEN_NAME_MAX_LENGTH %>
 </div>
 
 <div class="form_row">
 <label for="email"> Adres e-mail: </label>
 <%= form.text_field :email, 
                     :size => User::EMAIL_SIZE, 
                     :maxlength => User::EMAIL_MAX_LENGTH %>
 </div>
 
 <div class="form_row"
 <label for="password"> Hasło: </label>
 <%= form.text_field :password, 
                     :size => User::PASSWORD_SIZE, 
                     :maxlength => User::PASSWORD_MAX_LENGTH %>
 </div>

 <div class="form_row"
 <%= submit_tag "Zarejestruj !", :class => "submit" %>
 </div>
<% end %>

DO TEJ PORY WSZYSTKO CHODZI OKI (NIE WYSKAKUJA POWIADOMIENIA O BŁĘDACH W WYPEŁNIANIU FORMULARZA - ALE DO TEJ PORY TAK MA BYĆ).

DODATKOWO w pliku /helpers/application_helper.rb dodaje kod(początkowy plik byl pusty poza nazwą modułu):

Methods added to this helper will be available to all templates in the application.

module ApplicationHelper

def error_messages_for (*params)
options = params.extract_options!.symbolize_keys
if object = options.delete(:object)
objects = [object].flatten
else
objects = params.collect {|object_name|instance_variable_get("@#{object_name}") }.compact
end
count = objects.inject(0) {|sum, object| sum + object.errors.count }
unless count.zero?
html = {}
[:id, :class].each do |key|
if options.include?(key)
value = options[key]
html[key] = value unless value.bank?
else
html[key] = ‘errorExplanation’
end
end

options[:object_name] ||= params.first
options[:header_message] = “#{count == 1 ? count.to_s + " błąd uniemożliwił” : count < 5 ? count.to_s + " błędy uniemożliwiły" : count.to_s + “błędów uniemożliwiło”} zapisanie
#{options[:object_name].to_s.gsub(’_’, ’ ')} " unless options.include?(:header_message)
options[:message] ||= ‘Problemy wystąpiły w następujących polach:’ unless options.include?(message)
error_messages = objects.map {|object|object.errors.full_messages.map {|msg| content_tag(:li, msg)}}
contents = ‘’
contents << content_tag(options[:header_tag] || :h2, options[:header_message]) unless options[:header_message].blank?
contents << content_tag(:p, options[:message]) unless options[:message].blank?
contents << content_tag(:ul, error_messages)
content_tag(:div, contents, html)
else
‘’
end
end
end

NASTĘPNIE KOLEŚ DODAJE WYŚWIETLANIE BŁĘDÓW W FORMULARZU, W NASTĘPUJĄCY SPOSÓB: DO PLIKU APP/VIEWS/USER/register.rhtml DODAJE LINIJKĘ KODU
.
.
.

Wypełnij poniższy formularz

=================> <%= error_messages_for “user”, :object_name = “użytkownika” %> <===================================(tą właśnie linijkę)

 <div class="form_row">
 <label for="screen_name"> Pseudonim: </label>
 <%= form.text_field :screen_name, :size => User::S...

.
.
.
I niby według niego maja wyświetlać się błedy w formularzu !! Dodatkowo pokazuje to na zrzucie ekranu !! Pytanie podstawowe jakie mi sie narodziło to co to do cholery jest to “użytkownika” !!??

Proszę o POMOC bo siada mi już psycha…

Po pierwsze chciałbym Ci zasugerować skracanie pytania do meritum - nie musisz nam streszczać tego co czytasz. Twoje pytanie dotyczy opcji :object_name - tu mogę tylko zacytować dokumentację actionpack:

:object_name - The object name to use in the header, or any text that you prefer. If :object_name is not set, the name of the first object will be used.

Czy dobrze zrozumiałem Twoje pytanie?

INe chodzilo dokladnie o pytanie co to jest object name ale o to dlaczego obsluga bledow sie nie wyswietla. Byla to najprawdopodobniej blad w ksiazce poniewaz w pliku application_helper.rb brakowało:

require ‘string’
require ‘object’

zauważyłem to dopiero jak sciagnalem pliki z kodami z lekcji z tej ksiazki, bo tak to chyba nigdy bym niedoszedł. I dlatego dałem wam kilka plikow dla ogarniecia sytuacji. Co do funkcji object name tez dotarlem kiedy obsluga bledow zaczela dzialac. Tylko teraz mam taki problem ze bledy sa przetlumaczone i wyskakuja po polsku a naglowek jest po angielsku (na stronie formularza) :

3 errors prohibited this użytkownika from being saved

There were problems with the following fields:

Jakies pomysly ?

Wyrzuć tę pozycję do kosza i zaopatrz się w jakiś sensowny wstęp do Railsów. Nic innego nie potrafię polecić, przedstawiony przez Ciebie kod to masakra.

Autor tej książki zbyt dosłownie potraktował DRY. Definicja tych stałych tylko wprowadza bałagan. To, że w powtórzymy się pisząc

validates_length_of :title, :in => 5..10, :message => "Tytuł musi mieć długość od 5 do 10"

krzywdy wielkiej nam nie zrobi. Powtórzenie jest tak blisko siebie, że powoduje to wielkiego kłopotu w przypadku zmiany na inne wartości.

To fakt “radarek”.

Wcale nie chce kolesia a nawet kolesiów bronic (bo autorow jest dwoch), ale pewnie jak w wiekszosci takich ksiazek chce wpoić DRY (i inne nawyki) juz od poczatku, oczywiscie tak jak w tym przypadku ocierajac sie o przesadne zastosowanie DRY’a.

Może i jak w większości książek, ale w większości książek nie ma takiego kodu :wink: