2013-03-11 61 views
1

我通过轨道教程会和我的登录页面锻炼8.1.5后抛出一个异常,当我点击没有电子邮件或PW输入的登录按钮: http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec-rendering_with_a_flash_messageRails的教程3.2第8章错误:NoMethodError在SessionsController#创建

错误:

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文件中。 – 2013-03-11 05:55:09

+0

不 - 我尝试添加这一点,但它并没有帮助:DEF self.authenticate(电子邮件,submitted_pa​​ssword) \t用户= find_by_email(电子邮件) \t \t回报user.nil? ?无:用户 \t结束 – 2013-03-11 05:59:04

回答

0

我打量起这本书,你的代码的例子,我发现这条线

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

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

+0

感谢 - 没有运气添加到user.rb :(我试图改变你的上述使用电子邮件,而不是名字太多,仍然没有运气。我的请求显示会议参数与电子邮件和PW包括,但如果我有params [:session] [:email],我总是会得到这个错误。例如 - 这会在同一行创建一个错误:@ email = params [:session] [:email] – 2013-03-11 06:11:21

+0

让我拿一个看看这个例子,并回复你 – 2013-03-11 06:16:13

+0

我已经更正了答案,你应该删除我在第一个响应中提到的方法,希望它现在可以工作了! – 2013-03-11 06:19:52

0

我刚刚有同样的问题,发现事实上我需要[:会议]与结束!

所以行读取

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

希望这可以帮助别人的未来!

+0

我正在寻找解决方案以及...当我添加s,我得到一个“无效散列”错误。 – Linus 2013-04-16 11:05:23

+0

当我使用“会话”和登录信息是正确的,它的工作原理!但是当登录信息错误时,我得到无效的哈希错误。 – Linus 2013-04-16 11:23:33

0

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

我的新会话控制器看起来是这样的:

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]的所有实例都应该是[: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 
0

您能确认app/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

他们必须是相同的。

相关问题