2013-03-11 4 views
1

Я просматриваю учебное пособие по рельсам, и моя страница входа бросает исключение после упражнения 8.1.5, когда я нажимаю кнопку входа в систему без ввода адреса электронной почты или pw: http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec-rendering_with_a_flash_messageRails Tutorial 3.2 Ошибка главы 8: NoMethodError в SessionsController # create

Ошибка:

NoMethodError in SessionsController#create 
undefined method `[]' for nil:NilClass 
app/controllers/sessions_controller.rb:7:in `create' 

SessionsController соответствует конечный код именно для создания метода

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_email(params[:session][:email].downcase) #line 7 
    if user && User.authenticate(params[:session][:password]) 
     #will fill this in later 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    end 
end 

Я изменил ярлык кнопки для входа в систему вместо «Войти», поскольку это слишком запутывает «Зарегистрироваться», но я не думал, что это создаст проблему. сессий \ new.html.erb

<% provide(:title, "Log in") %> 
<h1>Log in</h1> 
<div class="row"> 
    <div class="span6 offset3"> 
    <%= form_for(:sesssion, url: sessions_path) do |f| %> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 

     <%= f.label :password %> 
     <%= f.password_field :password %> 

     <%= f.submit "Log in", class: "btn btn-large btn-primary" %> 

    <% end %> 
    <p>New user? <%= link_to "Sign up now!", signup_path %></p> 
    </div> 
</div> 

Этот пост намекает, что мне нужен метод в моей модели пользователя, но добавив, что не помогло: NoMethodError in SessionsController#create

Я попытался добавив в user.rb, но это не помогло results from find_by_email executed in function differs from console:

def self.authenticate(email, submitted_password) 
    user = find_by_email(email) 
    return user.nil? ? nil : user 
end 

Любые идеи, было бы весьма признателен!

+0

Привет, у вас есть метод User.authenticate (params [: session] [: password])? В файле User.rb. –

+0

Нет - Я пытался добавить это, но это не помогло: def self.authenticate (email, submitted_password) \t user = find_by_email (email) \t \t return user.nil? ? nil: user \t end –

ответ

0

Я смотрел на пример из книги и код, и я заметил эту линию

if user && User.authenticate(params[:session][:password]) 

ваш User.authenticate должны быть строчными к user.authenticate. Вернитесь к исходному коду.

+0

Спасибо - не повезло добавить это к user.rb :(Я попробовал изменить ваш выше, чтобы использовать электронную почту вместо имени тоже, и до сих пор не повезло. Мой запрос показывает параметр сеанса с включенным email & pw, но если у меня есть params [: session] [: email], я всегда получаю ошибку. Например - это создает ошибку в той же строке: @ email = params [: session] [: email] –

+0

Держитесь, позвольте мне взять посмотрите на пример и вернитесь к вам. –

+0

Я исправил ответ. Вы должны удалить метод, о котором я упомянул в первом ответе. Надеюсь, он работает сейчас! –

0

У меня была такая же проблема, и я обнаружил, что на самом деле мне нужны [: сеансы] с s на конце!

Так линия читает

if user && User.authenticate(params[:sessions][:password]) 

Надеется, что это поможет кому-то в будущем!

+0

Я также ищу решение ... Когда я добавляю s, я получаю ошибку «недопустимый хэш». – Linus

+0

Когда я использую «сессию», и информация для входа верна, она работает! НО, когда информация для входа неверна, я получаю недопустимую ошибку хэша. – Linus

0

У меня была такая же проблема после выполнения упражнения 1 в главе 8, где я заменил использование form_for на form_tag. Это привело к тому, что атрибуты имени в генерируемых полях ввода изменялись от name="session[email]" и name="session[password]" до name="email" и name="password". Впоследствии мне нужно было получить доступ к параметрам, используя params[:email] и params[:password] вместо params[:session][:email] и params[:session][:password].

Мой новый контроллер Сеансов выглядит следующим образом:

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    user = User.find_by_email(params[:email].downcase) 
    if user && user.authenticate(params[:password]) 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

    def destroy 
    sign_out 
    redirect_to root_url 
    end 
end 

Это решило проблему для меня. Надеюсь, это поможет кому-то другому.

0

В этом разделе из главы 8 учебника все экземпляры [: session] должны быть [: сеансы]. Надеюсь, это поможет.

class SessionsController < ApplicationController 
    . 
    . 
    . 
    def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 
    . 
    . 
    . 
end 
0

Не могли бы вы подтвердить правильное слово «сеанс» в приложении/view/session/new.html.erb?

Я вижу, Вы писали:

form_for(:sesssion, url: sessions_path) do |f|

Но в приложение/контроллеры/sessions_controller.rb, Вы писали:

user = User.find_by_email(params[:session][:email].downcase) #line 7

Они должны быть одинаковыми.

Смежные вопросы