write_attribute

Witam

Tak wygląda mój model:

[code=“ruby”] attr_accessible :surname, :forename, :login, :email, :password, :password_confirmation

def self.authenticate(login, password)
return nil if login.blank? || password.blank?
user = User.find_by_login_and_active(login.downcase, true)
user && user.authenticated?(password) ? user : nil
end

def login=(value)
write_attribute :login, (value ? value.downcase : nil)
end[/code]
Pole login nie występuje na formularzu. Jest ono tworzone z surname i forename z formularza.
Co bym nie robił z write_attribute to zawsze dostaje nul.

write_attribute :login, self.surname + “–” nie działa

Jak osiągnąc zamierzony efekt?

Pozdrawiam

Nie do końca zrozumiałem jaki ma być zamierzony efekt, przydałoby się jedno zdanie na ten temat a nie sam kod.

Jeśli jednak chcesz osiągnąć efekt: utwórz domyślny login z nazwiska to proponuję:

[code=“ruby”]class User <ActiveRecord::Base
before_validation_on_create :set_default_login

def set_default_login
self.login = [surname, “–”].compact.join unless login
end
end[/code]
Jeśli chcesz, żeby login był zawsze z małej litery to:

[code=“ruby”]class User <ActiveRecord::Base
before_validation_on_create :sanitize_login

def sanitize_login
self.login = login.downcase if login
end
end[/code]

Po Twojej poradzie nie wywala aplikacja żadnych błędów, ale i nic nie zapisuje do bazy.

Pole login natomiast nie występuje w Parametrach

Parameters: {“user”=>{“forename”=>“Sebastian”, “password_confirmation”=>“xxx”, “password”=>“xxx”, “surname”=>“Plewa”, “email”=>“a@a.pl”}, “commit”=>“Create”, “authenticity_token”=>“I51n9la3HMKGtwsGk/IcLQLDf+wGsq7Q7yJE8hCcwts=”}

I zaraz po tym jest BEGIN i ROLLBACK

Pozdrawiam

Jeszcze jedno pytanie.

Czy

def login=(value) write_attribute :login, value.downcase end
to to samo co

  self.login = self.login.downcase

Pozdrawiam

[quote=l0pez]Jeszcze jedno pytanie.

Czy

def login=(value) write_attribute :login, value.downcase end
to to samo co

  self.login = self.login.downcase

Pozdrawiam[/quote]
No to niezupełnie to samo. Pierwszy fragment to definicja metody (i przy okazji nadpisanie domyślnej), a drugi to wywołanie.

Jak chcesz, żeby login był tworzony z nazwiska to nie potrzebujesz definiować metody login= a tym bardziej nie powinieneś dodawać pola login do attr_accessible, bo będzie można je bezpośrednio zmodyfikowąć. Usuń te dwie rzeczy i zrób mniej więcej tak jak to napisał Bragi

class User <ActiveRecord::Base before_validation_on_create :set_default_login def set_default_login self.login = surname ? surname.downcase : nil end end

[quote=l0pez]Po Twojej poradzie nie wywala aplikacja żadnych błędów, ale i nic nie zapisuje do bazy.

Pole login natomiast nie występuje w Parametrach[/quote]
Nie występuje bo go tam nie chcesz mieć, bo nie wiesz czemu go nie ma czy może jeszcze co innego? Opisz swoje intencje dokładnie.

Brak zapisu może być spowodowany tym, że świerzo utworzony user nie jest valid. Pokaż formularz i klasę User, szczególnie jej walidacje.

Miałem jeszcze:

self.active = false i to powodowało takie zachowanie, dopiero jak dałem false w " to działa OK.

BTW lepiej stosować:

def login=(value)
write_attribute :login, value.downcase
end

czy

self.login = self.login.downcase

Pozdrawiam