обходить attr_accessible / защищенный в рельсах - PullRequest
1 голос
/ 22 января 2010

У меня есть модель, которая при создании экземпляра объекта также создает другой объект с тем же идентификатором пользователя.

class Foo > ActiveRecord::Base

after_create: create_bar

private

def create_bar
  Bar.create(:user_id => user_id #and other attributes)
end

end

В Bar.rb у меня есть attr_protected для защиты от хакеров.

class Bar > ActiveRecord::Base
  attr_protected :user_id, :created_at, :updated_at
end

В нынешнем виде я не могу создать новый объект Bar, не отключив attr_protected или не опустив user_id объекта Bar ...

Как я могу позволить объекту bar принимать атрибут: user_id от foo, не теряя защиты от attr_protected?

Ответы [ 3 ]

10 голосов
/ 01 марта 2013

При вызове new, create или find_or_create_by (и любых других, которые в конечном итоге вызывают new), вы можете передать дополнительную опцию, without_protection: true.

http://api.rubyonrails.org/v3.2.22/classes/ActiveRecord/Base.html#method-c-new

2 голосов
/ 23 января 2010

attr_protected фильтрует атрибуты в методе attributes=, который вызывается в new. Вы можете решить свою проблему с помощью:

def create_bar
  returning Bar.new( other attributes ) do |bar|
    bar.user_id = user_id
    bar.save!
  end
end
2 голосов
/ 22 января 2010

Попробуйте сделать:

def create_bar
  bar = Bar.build(... other params ...)
  bar.user_id = user_id
  bar.save!
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...