我跟踪Railscast tutorial以绕过批量分配,将role
模型的User
属性编辑为"admin"
。这就是我定义角色的方式:
class User < ActiveRecord::Base
attr_accessible :email, :password, :remember_me
attr_accessor :accessible
devise :database_authenticatable, ....etc
before_create :setup_default_role_for_new_users
ROLES = %w[admin default banned]
private
def setup_default_role_for_new_users
if self.role.blank?
self.role = "default"
end
end
def mass_assignment_authorizer
super + (accessible || [])
end
end
然后我创建了一个新的UsersController
只是为了解决我的更新方法问题:
def update
@user = User.find(params[:id])
@user.accessible = [:role] if user.role == "admin"
if @user.update_attributes(params[:user])
redirect_to @user, :notice => "Successfully updated user."
else
render :action => 'edit'
end
end
我不能这样做虽然因为这一行:if user.role == "admin"
,导致问题,给我错误:
NameError (undefined local variable or method `user' for UsersController
我在这里缺少什么?
提前致谢。
答案 0 :(得分:1)
user
中user.role == "admin"
部分您尝试使用的局部变量尚未在update
方法中定义。如果user
未被声明为可在您的控制器中访问的辅助方法,则ruby无法找到它。
从您的代码中我假设只有管理员用户可以更新其他用户的角色?因此,您没有使用@user.role == "admin"
,而是user.role == "admin"
?
如果是这样,您必须提供一个user
对象,无论是通过帮助程序方法(即在您的ApplicationHelper类中),还是在尝试在更新方法中使用它之前提取它,或者使用before_ *在你的控制器中回调。
我希望它清楚我的意思。