update_attributes не играет роли - PullRequest
2 голосов
/ 14 октября 2011

У меня есть модель с двумя линиями 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) работает.

Я использую монгоид.Есть идеи?

1 Ответ

4 голосов
/ 14 октября 2011

Я думаю, что вы нашли что-то, что еще не было реализовано в вашей версии Mongoid - но , пожалуйста, проверьте более позднюю версию Mongoid, где она, кажется, реализована начиная с 2.2.1!

В документе сказано, что: as является допустимым параметром в Mongoid :: Document

http://mongoid.org/docs/documents/access.html (см. Внизу страницы)

Но в нем говорится: Вы можете охватить массуназначение по роли путем предоставления роли в качестве опции конструктору или созданию методов.

В частности, речь не идет об update_attributes - update_attributes не является конструктором

Проверка в исходном коде показывает,что он не реализован в update_attributes () в версиях Mongoid <2.2.1, но в более поздних версиях он реализован! </p>

Если вы используете более позднюю версию Mongoid и у вас по-прежнему возникают проблемы, я бы порекомендовал опубликоватьэто в Google Mongoid Group как ошибка, в которой упоминается номер вашей версии 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...