Die Schienen attr_accessible funktioniert nicht für: Typ?
-
05-07-2019 - |
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
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"}>