Rails 关于 attr_accessible :as => :admin 的一个疑问

daqing · 2012年06月25日 · 最后由 clc3123 回复于 2012年06月26日 · 2573 次阅读

假如我有以下声明:

class Topic
  attr_accessible :title, :content
  attr_accessible :sticky, :as => :admin
end

那么,我想达到的效果是:普通用户可以修改titlecontent字段,除此之外,管理员还可以修改sticky字段。

但实际达到的效果是:管理员只能修改sticky字段。

也就是说,我必须这样写才行:

class Topic
  attr_accessible :title, :content
  attr_accessible :title, :content, :sticky, :as => :admin
end

这样,titlecontent 就重复写了两次,不知道大家是否遇到过这个问题。

我的疑问是,有没有好的办法去掉这种重复?

class Topic
  FIELDS = [:title, :content]
  attr_accessible *FIELDS
  attr_accessible *([:sticky] + FIELDS), :as => :admin
end

https://github.com/rails/rails/blob/master/activemodel/lib/active_model/mass_assignment_security.rb#L174

def attr_accessible(*args)
  options = args.extract_options!
  role = options[:as] || :default

  self._accessible_attributes = accessible_attributes_configs.dup

  Array(role).each do |name|
    self._accessible_attributes[name] = self.accessible_attributes(name) + args
  end

  self._active_authorizer = self._accessible_attributes
end

实现就是这样的,用数组自己解决一下吧。

#1 楼 @hooopo 用这个办法可以暂时解决一下。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号