Rails attr_accessible не работает для :type?
-
05-07-2019 - |
Вопрос
Я пытаюсь установить тип модели наследования одной таблицы в форме.Итак, у меня есть меню выбора для атрибута: type, а значения — это имена подклассов STI.Проблема в том, что журнал ошибок продолжает печатать:
ПРЕДУПРЕЖДЕНИЕ:Невозможно массово назначить эти защищенные атрибуты:тип
Поэтому я добавил в модель «attr_accessible:type»:
class ContentItem < ActiveRecord::Base
# needed so we can set/update :type in mass
attr_accessible :position, :description, :type, :url, :youtube_id, :start_time, :end_time
validates_presence_of :position
belongs_to :chapter
has_many :user_content_items
end
Ничего не меняет, ContentItem по-прежнему имеет :type=nil после вызова .update_attributes() в контроллере.Есть идеи, как массово обновить :type из формы?
Решение 3
Дуплекс на railsforum.com нашел обходной путь:
используйте виртуальный атрибут в формах и в модели вместо типа dirtectly:
def type_helper
self.type
end
def type_helper=(type)
self.type = type
end
Работал как шарм. Р>
Другие советы
мы можем переопределить attribute_protected_by_default
class Example < ActiveRecord::Base
def self.attributes_protected_by_default
# default is ["id","type"]
["id"]
end
end
e = Example.new(:type=>"my_type")
Вы должны использовать правильный конструктор, основанный на подклассе, который вы хотите создать, вместо вызова конструктора суперкласса и назначения типа вручную. Пусть ActiveRecord сделает это за вас:
# in controller
def create
# assuming your select has a name of 'content_item_type'
params[:content_item_type].constantize.new(params[:content_item])
end
Это дает вам преимущества определения другого поведения в ваших подклассах метод initialize () или обратные вызовы. Если вам не нужны эти виды преимуществ или вы планируете часто менять класс объекта, вы можете пересмотреть использование наследования и просто придерживаться атрибута.
"тип" иногда доставляет неприятности...Вместо этого я обычно использую слово «добрый».
Смотрите также: http://wiki.rubyonrails.org/rails/pages/ReservedWords
Я подписался на http://coderrr.wordpress.com/2008/04/22/building-the-right-class-with-sti-in-rails/ для решения той же проблемы, что и у меня. Я довольно новичок в мире Rails, поэтому не уверен, хорош ли этот подход или нет, но он работает очень хорошо. Я скопировал код ниже.
class GenericClass < ActiveRecord::Base
class << self
def new_with_cast(*a, &b)
if (h = a.first).is_a? Hash and (type = h[:type] || h['type']) and (klass = type.constantize) != self
raise "wtF hax!!" unless klass < self # klass should be a descendant of us
return klass.new(*a, &b)
end
new_without_cast(*a, &b)
end
alias_method_chain :new, :cast
end
class X < GenericClass; end
GenericClass.new(:type => 'X') # => #<X:0xb79e89d4 @attrs={:type=>"X"}>