2013-05-07 4 views
1

Вот мой SessionsControllerNoMethodError: не определен метод `[]» в рельсах 3

class SessionsController < ApplicationController 

def new 
end 

def create 
    user = User.find_by_email(params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     # Sign the user in and redirect to the user's show page. 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid email/password combination' # Not quite right! 
     render 'new' 
    end 
end 


def destroy 
end 

конец

Вот это routes.rb

resources :sessions, only: [:new,:create,:destroy] 

также соответствующие маршруты для нового и уничтожить взгляды.

здесь является new.html.erb

<% provide(:title , "Sign in")%> 
<div id="signin_page" class="hero-unit container-fluid"> 
<h1>Sign In</h1> 
<div class="row span6"> 
<%= simple_form_for :sessions, url: '/sessions', html: {:class=> 'form-horizontal'} do |f| %> 
<%= f.input :email, label: "Email", placeholder: "Enter email",required: true%> 
<%= f.input :password, label: "Password", placeholder: "Enter Password", required: true%> 
<p id="signin_button"><%= f.button :submit, "Sign in", class: "btn btn-large btn-primary span2" %> 
    New user? <%=link_to "Sign up now!", '/signup'%></p> 

<% end %> 
</div> 

ошибка походит. enter image description here

что я пытаюсь реализовать то, что, знак успеха/неудачи shouldrender соответствующих взглядов с флэш-сообщений. Где я иду не так. Я новичок в RoR

ответ

3

Вы должны использовать sessions вместо session т.е. использовать

params[:sessions][:email] 

вместо

params[:session][:email] 

Как ваша форма говорит sessions т.е. simple_form_for :sessions.

Но в контроллере вы обращаетесь к params[:sessions], который nil и затем вызвать [:email] на него, следовательно, он дает ошибку

undefined method '[]' for nil:NilClass 

, следовательно, изменить

user = User.find_by_email(params[:session][:email].downcase) 
if user && user.authenticate(params[:session][:password]) 

К

user = User.find_by_email(params[:sessions][:email].downcase) 
if user && user.authenticate(params[:sessions][:password]) 

и то он должен работать

+0

Это была глупая ошибка на моей стороне. Спасибо за быстрый ответ. :) – mrudult

1

Это потому, что значение params[:session][:email] равно нулю.

на основе вашего PrintScreen должна быть params[:sessions][:email]

0

Я думаю, что лучшая альтернатива

user = User.find_by(email: params[:sessions][:email].downcase) 

может быть:

user = User.find_by(email: params[:sessions][:email].downcase) if params[:sessions].try(:[],:email) 

Это означает, что пользователь будет ноль, если либо PARAMS [ : сеансы] или params [: sessions] [: email] - nil. То есть без повышения NoMethodError, даже если params пуст.