Rails チュートリアルを進めていますが、演習 8.1.5 の後でログイン ページで例外がスローされます。電子メールまたは pw を入力せずにログイン ボタンをクリックすると、http: //ruby.railstutorial.org/chapters/sign-in-サインアウト#sec-rendering_with_a_flash_message
エラー:
NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass
app/controllers/sessions_controller.rb:7:in `create'
SessionsController は、Create メソッドの最終的なコードと正確に一致します
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>
この投稿は、ユーザー モデルにメソッドが必要であることを示唆していますが、それを追加しても役に立ちませんでした: SessionsController#create の NoMethodError
これを user.rb に追加しようとしましたが 、関数で実行された find_by_email の結果が console とは異なります:
def self.authenticate(email, submitted_password)
user = find_by_email(email)
return user.nil? ? nil : user
end
どんなアイデアでも大歓迎です!