2009-10-17 20 views
7

Kennt jemand ein Juwel oder eine gute Implementierung, die es dem Benutzer erlaubt, Felder zu einem Modell hinzuzufügen?Benutzerdefinierte dynamische Modellfelder in Rails

Ex.

Der Benutzer möchte dem Kontaktmodell ein Feld "interne Notizen" hinzufügen. In der Schnittstelle würden sie wählen Sie einfach „Neues Feld“> „Typ: Text“

Dank

Antwort

6

Es tut mir leid ich nicht jedes Plugin wissen das zu tun. Aber ich habe einen Umsetzungsvorschlag.

Die Idee besteht darin, ein "DynamicField" -Modell hinzuzufügen, das eine has_many-Beziehung zum Kontaktmodell wäre. Wenn eine Methode im Kontaktmodell fehlt, prüfen Sie, ob in diesem Fall ein dynamisches Feld vorhanden ist, um sie abzurufen.

class DynamicField < ActiveRecord::Base 
    belongs_to :contact 
end 


class Contact < ActiveRecord::Base 
    has_many :dynamic_fields 

    def method_missing(sym, *args, &block) 
     begin 
      super 
     rescue 
      field = dynamic_fields.find_by_name(sym) 
     end 
     raise ActiveRecord::NoMethodError if field.nil? 
     field.value 
    end 
end 

Sie müssen einen regulären Ausdruck hinzufügen, wenn Sie virtuelle Attribute mit dem Attribut = Methode (Nachweis des Vorhandenseins eines „=“ und macht ein Update statt nur immer den Wert) hinzufügen möchten. Aber Sie haben schon hier die Idee.

Wenn die Methode nicht existiert, überprüfen wir die dynamischen Felder, wenn es einen mit dem gleichen Namen gibt. Wenn nicht (field.nil?), Wird ein NoMethodError ausgelöst. Ansonsten geben wir es zurück.

So können Sie eine Liste aller Felder, die mit der folgenden erhalten:

Contact.find(:first).dynamic_fields 

Und eine spezifische mit der folgenden abrufen:

Contact.find(:first).my_dynamic_field 
2

Hier ist eine andere Art und Weise tun.

Haftungsausschluss: Diese Methode wird wegen ihres Missbrauchspotenzials nicht empfohlen. In der Tat sollte es nur für Administratoren Ihrer Website zugänglich sein.

class MyModel < ActiveRecord::Base 
    ... 
    def self.add_column(name, type, args= {}) 
    ActiveRecord::Migration.add_column table_name, name, type, args 
    end 
end 
Verwandte Themen