Rails教程3.2第8章错误:SessionsController中的NoMethodError #create

时间:2013-03-11 05:47:14

标签: railstutorial.org nomethoderror

我正在浏览rails教程,我的登录页面在练习8.1.5之后抛出异常,当我点击没有电子邮件或输入pw的登录按钮时: http://ruby.railstutorial.org/chapters/sign-in-sign-out#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>

这篇文章暗示我需要在我的用户模型中使用一个方法,但添加它并没有帮助: 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

任何想法都将不胜感激!

5 个答案:

答案 0 :(得分:0)

我查看了本书中的示例和您的代码,我注意到了这一行

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

您的User.authenticate应该小写为user.authenticate。恢复原始代码。

答案 1 :(得分:0)

我刚遇到同样的问题,发现实际上我需要[:sessions]结尾的s!

所以行读

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

希望这可以帮助将来的某个人!

答案 2 :(得分:0)

在第8章练习1之后我遇到了同样的问题,我将form_for替换为form_tag。这导致生成的输入表单字段中的名称属性从name="session[email]"name="session[password]"更改为name="email"name="password"。随后,我需要使用params[:email]params[:password]代替params[:session][:email]params[:session][:password]访问参数。

我的新Sessions控制器如下所示:

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

这解决了我的问题。希望这对其他人有帮助。

答案 3 :(得分:0)

在教程第8章的这一节中,[:session]的所有实例都应该是[:sessions]。希望有所帮助。

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

答案 4 :(得分:0)

你能确认“会话”这个词吗?在app / view / session / new.html.erb拼写正确吗?

我看到你写道:

  

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

但是在app / controllers / sessions_controller.rb中,您写道:

  

user = User.find_by_email(params [:会话] [:电子邮件] .downcase)#line 7

它们必须相同。