2016-07-25 13 views
0

Ich habe vier MySQL-Tabellen, die gleichzeitig mit einem Klick auf eine simple_form-Schaltfläche gefüllt werden sollten. In der Form gibt es Eingabefelder für alle vorhandenen Spalten aus den Tabellen. Die Domain-Tabelle hat keine ID für die anderen Tabellen darunter, aber alle anderen haben eine Domain-ID in ihren Tabellen. Hier sind die Abhängigkeiten:Rails: simple_form füllt mehrere verbundene Tabellen

class Domain < ActiveRecord::Base 
    has_many :whitelists 
    has_many :blacklists 
    has_many :product_infos 
end 

class Whitelist < ActiveRecord::Base 
    belongs_to :domain 
end 

class Blacklists < ActiveRecord::Base 
    belongs_to :domain 
end 

class ProductInfo < ActiveRecord::Base 
    belongs_to :domain 
end 

Mein simple_form ist in der Ansicht der Domäne gespeichert.

<%= simple_form_for @domain do |f| %> 
    <%= f.input :name, placeholder: 'Example Shop' %> 
    <%= f.input :domain, placeholder: 'http://www.example.com' %> 

    <h3><b>Whitelist</b></h3> 
    <%= f.input :url_start, as: :text %> 
    <%= f.input :url_end, as: :text %><br> 

    <h3><b>Blacklist</b></h3> 
    <%= f.input :url_start, as: :text %> 
    <%= f.input :url_end, as: :text %><br> 

    <h3><b>Product Information</b></h3> 
    <%= f.input :id_tag %> 
    <%= f.input :name_tag %> 
    <%= f.input :product_info_text_tag %><br> 

    <%= f.button :submit %> 
<% end %> 

Meine Frage ist, wie Sie auf die anderen Spalten in der Ansicht zugreifen. Alle Eingaben außer denen aus der Domäne führen zu einer Fehlermeldung (unbekannte Methode oder lokale Variable). In den Modellen war es ziemlich einfach, auf Attribute aus einer anderen Tabelle zuzugreifen, aber ich komme nicht dahinter, wie es in der Ansicht funktioniert.

Bearbeiten: Ich habe jetzt das Formular und den Domänencontroller bearbeitet. Es funktioniert jedoch immer noch nicht. Keine Fehler, aber nur die Domain-Tabelle wird gefüllt.

Domänencontroller:

def new 
    @domain = Domain.new 
    @domain.whitelists.build 
    @domain.blacklists.build 
    @domain.product_infos.build 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_domain 
     @domain = Domain.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def domain_params 
     params.require(:domain).permit(:whitelist_attributes => [:url_start, :url_end], :blacklist_attributes => [:url_start, :url_end], :product_info_attributes => [:id_tag, :name_tag, :promo_price_tag, :price_tag, :shipping_cost_tag, :image_url_tag, :browse_tree_tag, :product_info_text_tag]) 
    end 

Antwort

1

wiki Nach Sie shoul wie das zu tun. Nur accepts_nested_attributes for :whitelists hinzufügen usw.

<%= simple_form_for @domain do |f| %> 
    <%= f.input :name, placeholder: 'Example Shop' %> 
    <%= f.input :domain, placeholder: 'http://www.example.com' %> 

    <%= f.simple_fields_for :whitelists do |w| %> 

     <%= w.input :url_start, as: :text %> 
     <%= w.input :url_end, as: :text %> 

    <% end %> 

    <%= f.simple_fields_for :blacklists do |b| %> 

     <%= b.input :url_start, as: :text %> 
     <%= b.input :url_end, as: :text %> 

    <% end %> 

    <%= f.simple_fields_for :products do |p| %> 

     <%= p.input :id_tag %> 
     <%= p.input :name_tag %> 
     <%= p.input :product_info_text_tag %> 
    <% end %>  
    <%= f.button :submit %> 
<% end %> 

Und in Ihrem Controller-Aktion, fügen @domain.whitelists.build usw.

Kursiv Linie sein sollte,

@domain.whitelists.build(params[:whitelists]) und so weiter.

+0

Danke! Dieses Mal keine Fehlermeldungen. Es wird jedoch nur die Domain-Tabelle gefüllt. In meiner Rails Server Konsole gibt es auch keine Fehler und nur das create Domain Skript wird ausgeführt. – GoYoshi

+1

Haben Sie 'params.require (: domain) .permit (: whitelist_attributes => [: url_start,: url_end],: blacklist_attributes ...)' zu 'domain_params' in Ihrem DomainsController hinzugefügt? – marmeladze

+0

Jetzt habe ich es hinzugefügt, aber immer noch nur die Domain-Tabelle gefüllt. Muss ich irgendwo im Controller ein neues Whitelist/Blacklist/Product_info Objekt erstellen? – GoYoshi

0

Gelöst es! Es war eine einfache Lösung:

params.require(:domain).permit(:whitelist_attributes => [:url_start, :url_end], :blacklist_attributes ...) 

Jedes Objekt ist hier singulär, aber wenn ich es geändert whitelists_attributes auf Plural, blacklists_attributes ... es hat funktioniert! Jeder Tisch wird jetzt gefüllt!

Verwandte Themen