Ruby on rails 4 未定义的方法“[]';对于nil:NilClass railstutorial.org 8.20>;
我正在学习Michael Hartl的rails教程,真的很有趣! 但从清单8.20开始,我就遇到了麻烦。 因为我猜我做了一个o型,我删除了应用程序,重新开始。。 最好的学习方法是重复,对吗 嗯。。在第二次构建时,我也遇到了同样的错误Ruby on rails 4 未定义的方法“[]';对于nil:NilClass railstutorial.org 8.20>;,ruby-on-rails-4,railstutorial.org,Ruby On Rails 4,Railstutorial.org,我正在学习Michael Hartl的rails教程,真的很有趣! 但从清单8.20开始,我就遇到了麻烦。 因为我猜我做了一个o型,我删除了应用程序,重新开始。。 最好的学习方法是重复,对吗 嗯。。在第二次构建时,我也遇到了同样的错误 > NoMethodError in SessionsController#create undefined method `[]' for nil:NilClass Extracted source (around line #7): 6 d
> NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass
Extracted source (around line #7):
6 def create
7 user = User.find_by(email: params[:session][:email].downcase)
8 if user && user.authenticate(params[:session][:password])
9 sign_in user
10 else
在谷歌搜索了几个小时后,我尝试重置数据库(drop/create/migrate测试:prepare)
我尝试过从示例中复制代码片段(例如控制器/助手/视图)
但我似乎找不到解决办法
这是你的密码
会话\u控制器:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
end
end
用户模型
class User < ActiveRecord::Base
before_save {self.email = email.downcase }
before_create :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX},
uniqueness: {case_sensetive: false}
has_secure_password
validates :password, length: { minimum: 3 }
def User.new_remember_token
SecureRandom.urlsafe_base64
# SecureRandom.urlsafe_base64
end
def User.encrypt(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.encrypt(User.new_remember_token)
end
end
如何正确复制粘贴错误日志?根据您收到的错误,问题显然存在于您的用户控制器中:
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
之所以生成此错误,是因为params[:session]
实际上是nil
。现在的问题是,为什么
我的猜测是,你的签名在形式上有一个拼写错误,应该是:
<%= form_for(:session, url: sessions_path) do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>
请确保键入的会话正确。我们可以查看更多错误信息,比如日志本身吗?这应该会告诉我们生成它的文件/行。我不认为这是问题所在,但您在
flash中有一个输入错误。现在[:success]
(您缺少一个s)我添加了错误:提取的源代码(在第7行附近):5 6 7 8 9 10 def create user=user.find_by(email:params[:session][:email]。downcase)如果用户&&user.authenticate(params[:session][:password])登录用户Elsey您赢得了(虚拟的)wassing机器!非常感谢:D在将会话更改为会话并重新启动服务器后,它工作了谢谢,我会。。你怎么这么快就猜到了?这是一个常见的错误吗?实际上是演绎。如果params[:session]
是nil
,而它本不应该是,那么在创建params[:session]
的表单中有一个打字错误是合乎逻辑的。再次感谢您!学习发现和理解错误同样重要
module UsersHelper
# Returns the Gravatar (http://gravatar.com/) for the given user.
def gravatar_for(user, options = { size: 50 })
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
size = options[:size]
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
<%= form_for(:session, url: sessions_path) do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>