nil的未定义方法`attributes':NilClass - Wicked / Devise gems

时间:2016-05-12 14:40:06

标签: ruby-on-rails devise wicked-gem

我正在尝试用Devise实现Wicked gem,因为我希望用户通过不同的步骤来完成他们的个人资料。我是一个完整的新手,所以如果你能给我一个关于可能出现问题的建议,我将不胜感激。

我得到的错误就是这个,当我尝试从“个人”继续到“风格”步骤时,它会显示出来。我想这是保存数据的问题:

NoMethodError in OnboardingController#update

undefined method `attributes' for nil:NilClass
 **@user.attributes(user_params)**

这些是我的注册和入职控制器:

class RegistrationsController < Devise::RegistrationsController


  protected 

  def after_sign_up_path_for(resource)
    '/onboarding/personal'
  end

  def after_update_path_for(resource)

    registration_steps_path

  end

  def new 

  super

  end



  def create

  super

  end



  def update 

  super

  end



  def update_resource(resource, params)
    if resource.encrypted_password.blank? # || params[:password].blank?
      resource.email = params[:email] if params[:email]
      if !params[:password].blank? && params[:password] == params[:password_confirmation]
        logger.info "Updating password"
        resource.password = params[:password]
        resource.save
      end
      if resource.valid?
        resource.update_without_password(params)
      end
    else
      resource.update_with_password(params)
    end
  end
end

class OnboardingController < ApplicationController
    include Wicked::Wizard
    steps :personal, :stylefirst


    def show
        @user = current_user
    render_wizard

    end

     def update

  @user = current_user

  @user.attributes(user_params)

  render_wizard @user

     end


end

1 个答案:

答案 0 :(得分:1)

使用Devise,如果没有用户登录,则current_usernil。因此,您的问题是,您在@user = current_user操作中未经验证就分配了update用户已登录。

如果您想确保update操作仅适用于已登录的用户,请使用Devise提供的authenticate_user!帮助程序操作:

class OnboardingController < ApplicationController
   before_filter :authenticate_user!, only: [:edit, :update]

   # ...
end

如果用户未登录,authenticate_user!帮助程序方法会将用户重定向到登录页面。如果用户成功登录,则会设置current_user并重定向回到最初尝试访问的页面。