我有一个带有两条attr_accessible线的模型
attr_accessible ...., :as => :user
attr_accessible ...., :as => :admin
然后在我的控制器中我这样做
if @user.update_attributes(params[:user],:as => :user)
我得到错误的参数2为1,但是:@user.assign_atrributes(params[:user],:as => :user)
有效。
我正在使用mongoid。有什么想法吗?
答案 0 :(得分:4)
我认为你在你的Mongoid版本中发现了一些尚未实现的东西 - 但请检查以后的Mongoid版本,它似乎是从2.2.1开始实现的!
该文档说:作为Mongoid :: Document
中的有效选项http://mongoid.org/docs/documents/access.html(参见页面底部)
但是它说:你可以通过提供角色作为构造函数或创建方法的选项,按角色来确定质量分配的范围。
它没有特别提及update_attributes - update_attributes不是构造函数
签入源代码表明它没有在Mongoid版本的update_attributes()中实现< 2.2.1,但后来的版本实现了它!
如果您使用的是更高版本的Mongoid,但仍然遇到问题, 我建议将此发布在Google Mongoid Group上作为bug,提及你的Mongoid版本号。
另见:
http://groups.google.com/group/mongoid/
编辑:
看起来它是Mongoid 2.1.7中缺少的功能
在mongoid源代码中的,update_attributes()调用write_attributes(),它不知道该选项:as
但是如果你看一下 Mongoid 2.3.1的源代码,你就会发现自2.2.1开始就实现了它!
write_attributes()调用assign_attributes,它遵循选项:as
# Allows you to set all the attributes for a particular mass-assignment security role
# by passing in a hash of attributes with keys matching the attribute names
# (which again matches the column names) and the role name using the :as option.
# To bypass mass-assignment security you can use the :without_protection => true option.
#
# @example Assign the attributes.
# person.assign_attributes(:title => "Mr.")
#
# @example Assign the attributes (with a role).
# person.assign_attributes({ :title => "Mr." }, :as => :admin)
#
# @param [ Hash ] attrs The new attributes to set.
# @param [ Hash ] options Supported options: :without_protection, :as
#
# @since 2.2.1
def assign_attributes(attrs = nil, options = {})
_assigning do
process(attrs, options[:as] || :default, !options[:without_protection]) do |document|
document.identify if new? && id.blank?
end
end
end
您可以通过以下方式找到源代码:
$ find ~/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.1.7/lib/ -type f -exec grep -l 'def write_attributes' {} \;
~/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.1.7/lib/mongoid/attributes.rb
$ emacs ~/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.1.7/lib/mongoid/attributes.rb