2016-09-03 2 views
2

Я не могу понять это для жизни меня, но вот мои модели:Простой флажок Форма для присоединиться отношение таблицы

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 

Так что я присоединиться к таблице, я пытаюсь сделать форма, которая бы выбрала флажки рядом с именами магазинов, которые пользователь выбрал (эта информация будет поступать из отношения таблицы соединений) и открыть флажки для остальных магазинов (исходящих из модели Store). Как показать это в представлении/заставить его работать и в контроллере. Вместо этого я бы использовал сборники? (Я использую Завещание и простую форму драгоценный камень)

Это то, что я до сих пор:

<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 %> 

магазин Контроллер:

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

ответ

3

Когда вы создали один или многие ко многим в рельсах модель получает _ids сеттер:

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

Это будет, например, настроить отн ция между пользователем 1 и магазинами с идентификаторами 1,2 и 3.

встроенных в Rails collection form helpers использовать этот:

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

Это создает список флажков для каждого магазина - если объединение существует он уже будет проверен. Обратите внимание, что мы не используем fields_for, так как это не вложенный вход.

SimpleForm has association helpers которые добавляют еще больше сахара.

<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

Большое вам спасибо! Ты спасатель! – ravip0711

+0

У меня был следующий вопрос: как сделать маршруты спокойными? Прямо сейчас я использую программу для пользователей, ресурс root 'home # index': user do resources: магазины заканчиваются. Когда пользователь подписывается, они переходят к контроллеру Home. Затем, когда вы просматриваете избранные магазины, они идут к контроллеру магазинов, но теперь с формой выше, они идут в Контроллер Пользователей, потому что он обновляет пользователя. Это верно? Должен ли я меняться, когда пользователь переходит в любимые магазины, он должен фактически быть контроллером пользователя, а не контроллером магазинов? – ravip0711

+0

Нет правильного ответа. Если его любимые магазины хранятся, то хорошим маршрутом может быть «GET | POST/users /: user_id/stores», и вам может понадобиться создать конкретный контроллер (UserStoresController или User :: StoresController) для его обработки. Но вы можете задать новый вопрос по этой теме. – max

Смежные вопросы