Frage

Im Versuch, den einzelnen Tabellenvererbungsmodell Typen in einer Form festgelegt. So habe ich ein Auswahlmenü für Attribute: Typen und die Werte sind die Namen der STI-Unterklassen. Das Problem wird das Fehlerprotokoll hält Druck:

  

ACHTUNG: Kann keine Massen zuweisen diese geschützten Attribute: type

Also ich fügte hinzu: "attr_accessible: Typ" zum Modell:

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

Hat nichts ändern, hat die ContentItem noch: type = nil nach .update_attributes () wird in der Steuerung aufgerufen. Jede Idee, wie man Masse aktualisieren Sie die: Typ aus einem Formular

War es hilfreich?

Lösung 3

Duplex bei railsforum.com fand eine Abhilfe:

  

ein virtuelles Attribut in den Formularen verwenden   und in dem Modell anstelle des Typs   dirtectly:

def type_helper   
  self.type 
end 
def type_helper=(type)   
  self.type = type
end

wie ein Charme.

Andere Tipps

Wir können außer Kraft setzen attributes_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")

Sie sollten den richtigen Konstruktor auf der Unterklasse basierend Sie erstellen möchten, anstatt den Oberklassenkonstruktors aufrufen und manuell eingeben zuweisen. Lassen Sie Active tun dies für Sie:

# in controller
def create
   # assuming your select has a name of 'content_item_type'
   params[:content_item_type].constantize.new(params[:content_item])
end

Das gibt Ihnen die Vorteile der Definition unterschiedliche Verhalten in Ihren Subklassen () -Methode oder Rückrufe initialisieren. Wenn Sie nicht über diese Art von Leistungen benötigen oder planen, die Klasse eines Objekts häufig zu ändern, sollten Sie mit Vererbung zu überdenken und nur Stick mit einem Attribut.

„Typ“ verursacht manchmal Probleme ... Ich benutze „Art“ in der Regel statt.

Siehe auch: http://wiki.rubyonrails.org/rails/pages/ReservedWords

Ich folgte http://coderrr.wordpress.com/2008/04/22/building-the-right-class-with-sti-in-rails/ für das gleiche Problem zu lösen ich hatte. Ich bin ziemlich neue Welt Rails so ist nicht so sicher, ob dieser Ansatz gut oder schlecht ist, aber es funktioniert sehr gut. Ich habe den Code unten kopiert.

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"}>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top