Ich arbeite durch Railscast: Authentifizierung von Grund auf in Rails 4, obwohl das Tutorial für Rails 3 erstellt wurde. Aus diesem Grund haben einige Änderungen musste aus den ursprünglichen Tutorial-Anweisungen gemacht werden.Railscasts: Authentifizierung von Grund auf neu - fehlende: Sitzungsparam Problem in Rails 4
Tutorial: http://railscasts.com/episodes/250-authentication-from-scratch?autoplay=true
laufenden in einen Fehler
param fehlt oder der Wert leer ist: Sitzung
Gedanken:
- Ich habe die 2 Controller unten verglichen. Meine Änderung aus dem Tutorial ist das Verschieben der Parameter in eine session_params-Methode.
- Ich verstehe den Fehler, weil der Hash, der gepostet wird, keinen Hash wie
"session" => { }
enthält. Aber ich habe kein tiefes Verständnis von Rails zu lösen.
Empfohlene Controller (Schienen 3)
def create
user = User.authenticate(params[:email], params[:password])
if user
session[:user_id] = user.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
Mein Controller (umgerechnet auf Schienen 4)
def create
user = User.authenticate(session_params)
if user
session[:user_id] = user.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
private
def session_params
params.require(:session).permit(:email, :password)
end
Bis zu diesem Punkt habe ich nur für Devise benutzen Authentifizierung, so ein großes Dankeschön im Voraus, wenn Sie einen Rat teilen können.
UPDATE
Als Formular angefordert, um zu Posten Sitzung
<h1>Log in</h1>
<%= form_tag sessions_path do %>
<p>
<%= label_tag :email %> <br/>
<%= text_field_tag :email, params[:email] %>
</p>
<p>
<%= label_tag :password %> <br/>
<%= password_field_tag :password %>
</p>
<p class="button"> <%= submit_tag %> </p>
<% end %>
UPDATE 2
Auch user.rb Modell
class User < ActiveRecord::Base
attr_accessor :password
before_save :encrypt_password
validates_confirmation_of :password
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_uniqueness_of :email
def self.authenticate(email, password)
user = find_by_email(email)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, password_salt)
user
end
end
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
end
können Sie Ihre form_for auch posten? Verwenden Sie auch 'gem bcrypt'? – 7urkm3n
Hinzugefügt das Formular, obwohl ich für das Tutorial ein form_tag benutze. Ja - ich benutze bcrypt. –
Sie benötigen keine 'Ressourcen: Sitzungen' in Routen. – 7urkm3n