kiedy korzystam z gotwej akcji dodanie nowego usera do bazy wygenrowanej poprzez scaffold dostaje taki błąd
[code]
SystemStackError in UzytkownicyController#create
stack level too deep
RAILS_ROOT: script/…/config/…
Application Trace | Framework Trace | Full Trace
app/models/user.rb:10:in digest' app/models/user.rb:10:inhexdigest’
app/models/user.rb:10:in password=' app/models/user.rb:10:inpassword=’
app/controllers/uzytkownicy_controller.rb:25:in new' app/controllers/uzytkownicy_controller.rb:25:increate’[/code]
oto mój model
[code]class User < ActiveRecord::Base
set_primary_key ‘user_id’
validates_presence_of :username
validates_uniqueness_of :username
attr_accessor :password_confirmation
attr_reader :password
def password=(pw)
self.password = Digest::MD5.hexdigest(pw)
end
def password_is?(pw)
Digest::MD5.hexdigest(pw) == password
end
end[/code]
co jest wynikiem tego błędu?
Jest to spowodowane nieskończoną rekurencją. Oto kawałek kodu, który jest za to odpowiedzialny:
def password=(pw)
self.password = Digest::MD5.hexdigest(pw)
end
dzięki pomogło
a mam jeszcze jedno pytanie, jak zrobić aby przy dodwania nowego usera hasło wpisane było zamieniane na hash MD5 i w takiej postaci było dodwane do bazy
mam tak ale dodaje mi hasło w postaci zwykłego tekstu
[code]
def password_new=(pw)
self.password = Digest::MD5.hexdigest(pw)
end
def password_is?(pw)
Digest::MD5.hexdigest(pw) == password
end[/code]
W modelu User, prócz standardowych login, e-mail, potrzebujesz także pola hash (na hash hasła). Następnie do tego modelu dodajesz wirtualny atrybut o nazwie password.
[code]class User
attr_accessor :password_confirmation
validates_confirmation_of :password
def password=(pwd)
@password = pwd
self.hash = Digest::MD5.hexdigest(pwd)
end
def password
@password
end
def validate
errors.add_to_base(‘Missing password’) if hash.blank?
end
end[/code]
Potem w formularzu logowania używasz wirtualnego atrybutu:
[code]<% form_tag do %>
Name:
<%= text_field_tag :login, params[:login] %>
Password:
<%= password_field_tag :password, params[:password] %>
<%= submit_tag 'Login', :class => 'submit' %>
<% end %>[/code]
właśnie tego nie rozumiem dlaczego wszyscy robie dodatkowe pole hash na hash hasła, ja chce przetrzymywać w bazie w polu password hash hasła nie w dodatkowym
przy pomocy radareka problem został rozwiąznay
[code]require ‘digest/md5’
class User < ActiveRecord::Base
set_primary_key ‘user_id’
def password=(pw)
write_attribute(:password, Digest::MD5.hexdigest(pw))
end
def password_is?(pw)
Digest::MD5.hexdigest(pw) == password
end
end[/code]