0

我正在尝试修复 Rails 应用程序中的身份验证问题。

当用户(称为会员)注册时,会抛出以下错误:

nil:NilClass 的未定义方法“保存”

这是在我的 session_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 为零?

4

2 回答 2

0

我假设当用户登录时会发生这种情况,因为我在那里看到了问题。找不到这样的用户。login不会更改帐户,nil如果找不到该帐户,肯定可以返回:由于电子邮件不存在密码错误。这就是为什么这个 railscast不检查user.save(为什么甚至save是未更改的实体?),而只是检查user(如果它是nil,它会跳转到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将用户对象传递给数据库以立即保存,然后您再次保存它。您应该改用new它,它只创建一个 Ruby 对象来填充初始参数 - 然后保存。

但是,您不能只使用@m = M.create(...)and if @m,因为如果create验证参数失败,仍然会返回一个“候选”对象,所以它总是true.

def create
  @member = Member.new(member_params)
  if @member.save
    auto_login(@member)
    redirect_to profile_path(current_member)
  else
    render 'new'
  end
end

所以......总结一下:阅读本文并让您的代码接近那里提供的代码片段,直到它工作并且您能够在它中断时进行跟踪。

于 2014-09-07T22:24:08.600 回答
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
于 2014-09-07T21:15:43.517 回答