Вопрос

Я пытаюсь установить тип модели наследования одной таблицы в форме.Итак, у меня есть меню выбора для атрибута: 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"}>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top