我正在浏览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
任何想法都将不胜感激!
答案 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
它们必须相同。