我正在尝试修复Rails应用中的身份验证问题。
当用户(称为成员)注册时,将引发以下错误:
未定义的方法`save'为零:NilClass
这是我的sessions_controller.rb ...
def create
@member = login(params[:email], params[:password])
if @member.save
session[:member_id] = @member.id
auto_login(@member)
redirect_to root_path, notice: "hi #{@member.name}."
else
flash.now.alert = "login fail."
render :new
end
end
这是在我的members_controller.rb ...
def create
@member = Member.create(member_params)
if @member.save
auto_login(@member)
redirect_to profile_path(current_member)
else
render 'new'
end
end
@member为什么会是nil?
答案 0 :(得分:0)
在你的members_controller上试试这个:
def create
@member = Member.new(member_params)
if @member.save
auto_login(@member)
redirect_to profile_path(current_member)
else
render 'new'
end
end
答案 1 :(得分:0)
我认为当用户登录时会发生这种情况,因为我看到了一个问题。找不到这样的用户。 login
不会更改帐户,如果找不到此类帐户,则肯定会返回nil
:要么是因为不存在的电子邮件,要么是密码错误。这就是为什么this railscast不检查user.save
(为什么save
一个未更改的实体?),而只是user
(如果它是nil
,它会跳转到{{} 1}}):
else
您在注册过程中使用class SessionsController < ApplicationController
def new
end
def create
user = login(params[:email], params[:password], params[:remember_me])
if user
redirect_back_or_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Email or password was invalid."
end
end
end
也很奇怪。 save
传递数据库的用户对象以立即保存,然后再次保存它。您应该使用create
代替,只创建一个Ruby对象来填充初始参数 - 然后保存。
但是,您不能只使用new
和@m = M.create(...)
,因为如果if @m
无法验证参数,则仍会返回“候选”对象,因此它始终为{ {1}}。
create
所以...总结一下:read this并保持你的代码接近那里提供的片段,直到它工作,你能够在它破裂时追踪。