używam dynamicznego attr_accessible
zgodnie z tym artykułem:mass_assignment_authorizer i zagnieżdżonych atrybuty
http://asciicasts.com/episodes/237-dynamic-attr-accessible
To działa dobrze. Ale nie znalazłem eleganckiego sposobu, aby działał z atrybutami zagnieżdżonymi. Oto uproszczony kod:
class Company < ActiveRecord::Base
has_many :employees
accepts_nested_attributes_for :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
attr_protected :salary
attr_accessor :accessible
def mass_assignment_authorizer
if accessible == :all
ActiveModel::MassAssignmentSecurity::BlackList.new
else
super + (accessible || [])
end
end
end
Załóżmy, że mam interfejs administratora z formularzem RESTULT dla firmy. W tym formularzu mam pola dla employees_attributes
, w tym puste pola do tworzenia nowych pracowników. Nie mogę znaleźć sposobu na wywołanie Employee#accessible=
w tym kontekście. Przeglądając kod źródłowy ActiveRecord, wydaje się, że może to być niemożliwe: w najodleglejszej części bardzo głębokiego stosu wywołań, zagnieżdżone skojarzenia powodują, że wywoływane są Employee.new
z atrybutami.
Zastanowiłem się nad stworzeniem specjalnego atrybutu, który mógłby zostać przekazany w ramach przydziału masy. Jeśli wartością atrybutu byłby właściwy kod, instancja Employee ustawiłaby @accessible
na :all
. Ale nie sądzę, że istnieje sposób zagwarantowania, że ten atrybut zostanie ustawiony przed chronionymi atrybutami.
Czy istnieje sposób na to, aby atrybuty chronione dynamicznie działały z atrybutami zagnieżdżonymi?
Tak, musisz dodać employees_attributes do listy dostępnych atrybutów. Ale prawdziwym problemem jest ustawienie atrybutu "dostępny" na samych obiektach pracowników. Zauważ, że ma to znaczenie tylko wtedy, gdy używasz * dynamicznych * dostępnych atrybutów, zgodnie z artykułem cytowanym na początku pytania. – rlkw1024