我正在尝试用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
答案 0 :(得分:1)
使用Devise,如果没有用户登录,则current_user
为nil
。因此,您的问题是,您在@user = current_user
操作中未经验证就分配了update
用户已登录。
如果您想确保update
操作仅适用于已登录的用户,请使用Devise提供的authenticate_user!
帮助程序操作:
class OnboardingController < ApplicationController
before_filter :authenticate_user!, only: [:edit, :update]
# ...
end
如果用户未登录,authenticate_user!
帮助程序方法会将用户重定向到登录页面。如果用户成功登录,则会设置current_user
并重定向回到最初尝试访问的页面。