1

我正在阅读 Rails 教程,在练习 8.1.5 之后,当我单击登录按钮时没有输入电子邮件或密码时,我的登录页面抛出异常: 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>

这篇文章暗示我需要在我的用户模型中使用一个方法,但添加它并没有帮助: NoMethodError in SessionsController#create

我尝试将其添加到 user.rb,但它没有帮助 find_by_email 在函数中执行的结果与控制台不同

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

我刚刚遇到了同样的问题,发现实际上我需要 [:sessions] 最后带有一个 s !

所以行读

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

希望这对将来的人有所帮助!

于 2013-04-08T18:39:26.203 回答
0

在第 8 章的练习 1 中我替换了form_forwith的使用后,我遇到了同样的问题form_tag。这导致生成的输入表单字段中的名称属性从name="session[email]"name="session[password]"变为name="email"name="password"。随后,我需要使用params[:email]andparams[:password]而不是params[:session][:email]and访问参数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

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

于 2013-10-08T02:18:25.193 回答
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
于 2013-11-24T17:26:49.633 回答
0

您能否确认 app/view/session/new.html.erb 中的“会话”一词拼写正确?

我看到你写道:

form_for(:会话, url: session_path) 做 |f |

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

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

它们必须相同。

于 2014-08-03T06:18:25.710 回答