在更新用户时绕过批量分配时出现NameError?

时间:2012-01-15 16:44:54

标签: ruby-on-rails ruby ruby-on-rails-3 devise cancan

我跟踪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

我在这里缺少什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

useruser.role == "admin"部分您尝试使用的局部变量尚未在update方法中定义。如果user未被声明为可在您的控制器中访问的辅助方法,则ruby无法找到它。

从您的代码中我假设只有管理员用户可以更新其他用户的角色?因此,您没有使用@user.role == "admin",而是user.role == "admin"

如果是这样,您必须提供一个user对象,无论是通过帮助程序方法(即在您的ApplicationHelper类中),还是在尝试在更新方法中使用它之前提取它,或者使用before_ *在你的控制器中回调。

我希望它清楚我的意思。