2016-04-04 1 views
0

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 
+0

können Sie Ihre form_for auch posten? Verwenden Sie auch 'gem bcrypt'? – 7urkm3n

+0

Hinzugefügt das Formular, obwohl ich für das Tutorial ein form_tag benutze. Ja - ich benutze bcrypt. –

+0

Sie benötigen keine 'Ressourcen: Sitzungen' in Routen. – 7urkm3n

Antwort

1

Versuchen Sie diese und fügt hinzu:

in sessions_controller.rb

def create 
    @user = User.find_by(email: params[:session][:email].downcase) 
    if @user && @user.authenticate(params[:session][:password]) 
     session[:user_id] = @user.id 
     flash[:success] = "#{@user.email}, Successfully Logged In" 
     redirect_to root_url, :notice => "Logged in!" 
    else 
     flash.now[:danger] = "Incorrect User/Password" 
     render 'new' 
    end 
end 

HTML-Formular

<%= form_for :session, url: :sessions do |f| %> 

    <div class="field"> 
     <%= f.label :email %> 
     <%= f.email_field :email %> 
    </div> 

    <div class="field"> 
     <%= f.label :password %> 
     <%= f.password_field :password %> 
    </div> 

    <%= f.submit "Sign In", class: "button" %> 
<% end %> 

routes.rb

post 'sessions' => 'sessions#create' 

Benutzer.rb

class User < ActiveRecord::Base 
    has_secure_password 

    validates_confirmation_of :password 
    validates_presence_of :password, :on => :create 
    validates_presence_of :email 
    validates_uniqueness_of :email 

end 
+0

Erhalte einen Fehler 'falsche Anzahl von Argumenten (gegeben 1, erwartet 2)', bezogen auf 'def self.authenticate (E-Mail, Passwort)' Methode in user.rb –

+0

wo ist das 'self.authenticate' Methode gefunden? – 7urkm3n

+0

user.rb - oben hinzugefügt. –

Verwandte Themen