为什么在nil中使用未定义的方法`save':在rails中使用Sorcery身份验证时为NilClass

时间:2014-09-07 20:47:36

标签: ruby-on-rails sorcery

我正在尝试修复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?

2 个答案:

答案 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并保持你的代码接近那里提供的片段,直到它工作,你能够在它破裂时追踪。