2016-09-03 2 views
2

Ich kann dies für das Leben von mir nicht herausfinden, aber hier sind meine Modelle:Einfaches Formular Kontrollkästchen für Join-Tabelle Beziehung

class User < ApplicationRecord 
    has_many :user_stores 
    has_many :stores, through: :user_stores   
end 

class UserStore < ApplicationRecord 
    belongs_to :user 
    belongs_to :store 
end 

class Store < ApplicationRecord 
    has_many :user_stores 
    has_many :users, through: :user_stores 
end 

So habe ich einen Tisch kommen, ich versuche, eine machen Formular, das Kontrollkästchen neben den Geschäftsnamen, die der Benutzer ausgewählt hat, ausgewählt hätte (diese Informationen würden aus der Join-Tabellen-Beziehung stammen) und Kontrollkästchen für die verbleibenden Geschäfte öffnen (die aus dem Store-Modell stammen). Wie zeige ich das in der Ansicht/mache es auch im Controller möglich. Würde ich stattdessen Sammlungen verwenden? (Ich verwende Devise und Einfaches Formular gem)

Dies ist, was ich bisher:

<h1>Add Favorite Stores</h1> 
<%= simple_form_for(@user, html: { class: 'form-horizontal' }) do |f| %> 
    <%= f.fields_for :stores, @user.stores do |s| %> 
    # not sure if this is the right way or not 
    <% end %> 
    <%= f.button :submit %> 
<% end %> 

Shop Controller:

class StoresController < ApplicationController 
... 
    def new 
    @user = current_user 
    @stores = Store.all 
    # @user.stores => shows user's stores (from join table) 
    end 
end 

Antwort

3

Wenn Sie eine eine oder viele zu viele Beziehung aufgebaut in Schienen erhält das Modell eine _ids setzer:

User.find(1).store_ids = [1,2,3] 

Dies würde zum Beispiel das Einrichten eines rel ation zwischen Benutzer 1 und den Geschäften mit ids 1,2 und 3.

Die eingebaute Rails collection form helpers nutzen diese:

<%= form_for(@user) do |f| %> 
    <% f.collection_check_boxes(:store_ids, Store.all, :id, :name) %> 
<% end %> 

Dies ist eine Liste von Kontrollkästchen für jedes Geschäft schafft - wenn ein Verein existiert es wird bereits überprüft. Beachten Sie, dass wir fields_for nicht verwenden, da es sich nicht um eine geschachtelte Eingabe handelt.

SimpleForm has association helpers die noch mehr Zucker hinzufügen.

<h1>Add Favorite Stores</h1> 
<%= simple_form_for(@user, html: { class: 'form-horizontal' }) do |f| %> 
    <%= f.association :stores, as: :check_boxes %> 
    <%= f.button :submit %> 
<% end %> 
+0

Vielen Dank! Du bist ein Lebensretter! – ravip0711

+0

Ich hatte eine Follow-up-Frage: Wie würden die Routen erholsamer werden? Im Moment benutze ich Devise für Benutzer, root 'home # index' Ressource: Benutzer tun Ressourcen: speichert Ende. Wenn sich der Benutzer anmeldet, geht er zum Home-Controller. Dann gehen sie beim Auschecken von Lieblingsgeschäften zum Stores-Controller, aber jetzt gehen sie mit dem obigen Formular zum Benutzer-Controller, weil dieser den Benutzer aktualisiert. Ist das korrekt? Sollte ich mich ändern, wenn ein Benutzer zu den Lieblingsgeschäften geht, sollte es eigentlich der Benutzer-Controller und nicht der Stores-Controller sein? – ravip0711

+0

Dort gibt es keine richtige Antwort. Wenn es die Favoriten des Benutzers sind, kann eine gute Route "GET | POST/users /: user_id/stores" sein und Sie möchten vielleicht einen bestimmten Controller (UserStoresController oder User :: StoresController) erstellen, um damit umzugehen. Vielleicht möchten Sie jedoch eine neue Frage zu diesem Thema stellen. – max

Verwandte Themen