1

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

どんなアイデアでも大歓迎です!

4

5 に答える 5

0

本とあなたのコードの例を見て、この行に気づきました

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

User.authenticate は小文字で user.authenticate にする必要があります。元のコードに戻します。

于 2013-03-11T06:03:52.633 に答える
0

app/view/session/new.html.erb の「session」という単語のスペルが正しいことを確認できますか?

あなたが書いたのを見ました:

form_for (:セッション , url: セッションパス) do |f|

しかし、app/controllers/sessions_controller.rb には次のように書いています。

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

それらは同じでなければなりません。

于 2014-08-03T06:18:25.710 に答える