2016-07-14 29 views
0

Hier ist meine aktuelle Situation:Wie verwenden Sie ein Formular von einem anderen Controller, um einen Wert festzulegen, der eine has_many: through-Beziehung in Rails4 hat?

Ich habe ein Modell :companies und ein Modell :users (Devise). Ein Unternehmen kann viele moderierende Benutzer durch ein drittes Modell :moderator_connections und umgekehrt haben. Um einen aktuellen Moderator auszuwählen, habe ich dem Modell :users die Spalte current_company (nicht referenziert) hinzugefügt.

Ich möchte eine dropdown_menu unter meinem Hauptmenü auf der gesamten Website hinzufügen. Wenn Sie in diesem Menü eine aktuelle Firma auswählen, kann der Benutzer zum Inhalt dieser Firma wechseln. Ich habe versucht, dies zu tun, indem ich ein Formular-teilweise über dem <%= yield %> in meinem application.html.erb rendere. Die form versucht, den current_company integer zu bearbeiten (indem sie sie an die company_id von einem der angeschlossenen Unternehmen zu verändern) für die current_user, aber ich glaube, ich bin nicht einmal in der Nähe, es zu lösen :(

Hier sind meine Beziehungen.

/models/company.rb:

has_many :moderator_connections  
has_many :moderators, through: :moderator_connections, class_name: 'User', foreign_key: 'company_id' 

/models/user.rb:

has_many :moderator_connections 
has_many :moderated_companies, through: :moderator_connections, class_name: 'Company', foreign_key: 'user_id' 

/Modelle/mod erator_connection.rb:

belongs_to :user 
belongs_to :company 

/layouts/application.html.erb:

<main> 
    <div class="container"> 
     <%= render partial: "users/current_company_form" %> 

     <%= render partial: "shared/message" %> 

     <%= yield %> 
    </div> 
</main> 

/users/_current_company_form.html.erb:

<% if user_signed_in? %> 
<%= form_for edit_user_registration_path do |f| %> 
    <div class="form-group"> 
     <%= f.collection_select :current_company, current_user.moderator_connections(:company_id), :name, :id,{ prompt: "Choose a company" } %> 

     <%= f.hidden_field :current_company, :value => current_user.moderator_connections(:company_id) %> 

    <div class="actions"> 
     <%= f.submit %> 
    </div> 
<% end %> 

Es geht schon los mit Beim Rendern des Partials erhalte ich den folgenden Fehler (abhängig von der Seite, in der ich mich befinde): No route matches [POST] "/pages/welcome"

Um ehrlich zu sein, ich habe keine Ahnung, wie man das schafft (wie Sie aus meinen törichten Versuchen schließen können). Kann mir jemand helfen?

Antwort

0

Ich bin mir nicht ganz sicher, aber ich denke, das sollte funktionieren:

<% if user_signed_in? %> 
<%= form_for current_user, url: edit_user_registration_path do |f| %> 
    <div class="form-group"> 
     <%= f.collection_select(:current_company, current_user.moderated_companies, :id, :name, prompt: "Select a company") %> 
    <div class="actions"> 
     <%= f.submit %> 
    </div> 
    <% end %> 
<% end %> 

Lassen Sie mich wissen, ob das funktioniert, aber!

UPDATE

Ich denke, Sie sollten zu verwenden, ändern:

#user.rb 
has_many :moderated_companies, through: :moderator_connections, source: :company 

#company.rb 
has_many :moderators, through: :moderator_connections, source: :user 
+0

Lieber @oreoluwa, vielen Dank für Ihre Antwort. Ich erhalte einen neuen Fehler: 'Die Quellenassoziation (en)" moderated_company "oder: moderated_companies konnte im Model ModeratorConnection nicht gefunden werden. Probieren Sie 'has_many: moderated_companies,: through =>: moderator_connections,: source =>'. Ist es eine von Benutzer oder Firma? ' Es scheint, als ob meine Assoziationen noch nicht richtig ausgerichtet sind. Irgendwelche Ideen, wie man die richtigen Assoziationen hinzufügt? –

+0

aktualisiert meine Antwort, hoffe, dass funktioniert – oreoluwa

+0

Ja, viel besser! Immer noch ein Fehler ('No route matches [PATCH]"/users/edit "'). Muss ich manuell eine Patch-Route zu meinen Routen hinzufügen? –