2010-12-03 11 views
1
ändern

Dies sollte für jemanden einen Layup sein ...Rubin/Rails: dynamisch Attribut in gemeinsam genutzten Teil

Ich versuche, ein Formularfeld des Attributs zu ändern, je nachdem, welcher Controller/Modell der Teil ruft das Formular enthält, Felder ...

Das Problem (unten) ist mit parent_id ..., die eine von zwei Spalten in einer Hunde-Tabelle verweist. Es muss entweder kennel_id oder master_id sein, je nachdem, welche Ansicht dieses Teil in gerendert wird.

nicht komfortabel genug, doch Ruby/Rails Sprache/Syntax/Werkzeuge, um diese dynamisch zu ändern, ohne in if/else Aussagen zu verzetteln.

Ich bin eine teilweise geteilt aufrufen und in einer lokalen Variablen übergeben:

= render "dogs/form", :parent => @kennel 

oder

= render "dogs/form", :parent => @master 

Im Teil Ich mag würde zu:

= form_for ([parent, target.dogs.build]) do |f| 
    = render "shared/error_messages", :target => parent 

    .field 
     = f.label :name 
     = f.text_field :name 
    .field 
     = f.hidden_field :parent_id ### <= PROBLEM 
    .actions 
     = f.submit 'Save' 

Antwort

1

Nur laut denken:

Ich weiß nicht, ob die parent -Modelle, die richtigen Namen für sie haben, aber man könnte so etwas wie tun:

= f.hidden_field "#{parent.class.name.underscore}_id" 

Aber das sieht nicht richtig aus. Also, warum nicht als Argument übergeben?

= render "dogs/form", :parent => @master, :foreign_key => :master_id 

Oder erstellen Aliase auf dem Hundemodell eine Art dynamischer Delegation zu handhaben:

class Dog 
    def parent_id=(parent_id) 
    case parent.class 
    when Master then self.master_id = parent_id 
    when Kennel then self.kennel_id = parent_id 
    end 
    end 
    def parent_id 
    case parent.class 
    when Master then self.master_id 
    when Kennel then self.kennel_id 
    end 
    end 
end 

Aber das saugt auch. Könnte die Beziehung polymorph sein? Dann können Sie den Wechsel weglassen.

class Dog 
    belongs_to :owner, :polymorphic => true 
end 

= f.hidden_field :owner_id 

Nur ein paar Ideen. Hoffentlich macht einer von ihnen Sinn für Sie ...

+0

Danke! alle guten Ideen und sehr hilfreich! Ich hatte versucht, die Verwandtschaft polymorph zu machen, ABER es ist möglich und oft wahrscheinlich, dass ein Hund BEIDEN Zwinger UND einem Meister angehört ... und ich bin nicht sicher, ob das mit Polymorphie möglich ist?!? – Meltemi

+0

versucht, einen anderen Hash wie in Ihrem zweiten Vorschlag zu übergeben (': foreign_key =>: master_id'), aber ich bekomme' undefinierte Methode 'foreign_key' für # '?!? Sollte nicht "': master_id' "jedes Vorkommen von" 'fremder_Schlüssel" wörtlich im Teil ersetzen? Stattdessen scheint es, 'fremder_key' in eine Art Methode zu verwandeln?!? seufz ... – Meltemi

+0

ah ... ': foreign_key' wird zu einer LOCAL-Variable' foreign_key' im partiellen .. so entfernt das ":" im partiellen und jetzt funktioniert es. Dies ist einer jener Fälle, in denen die Flexibilität von Ruby & Rails es tatsächlich (in vielerlei Hinsicht) für jemanden wie mich schwieriger macht, etwas zu lernen. Es gibt so viele Möglichkeiten, etwas zu schreiben, von dem ich nicht weiß, was die "Regeln" eigentlich sind ... wie jedes Mal, wenn ich eins lerne, es kaputt zu werden scheint ... Meltemi