连接表关系的简单表单复选框

时间:2016-09-03 17:05:22

标签: ruby-on-rails simple-form

我无法解决这个问题,但这是我的模特:

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

所以我有一个连接表,我试图创建一个表单,它会选择用户选择的商店名称旁边的复选框(此信息将来自连接表关系)并打开复选框对于剩余的商店(来自商店模式)。如何在视图中显示/使其在控制器中工作。我会使用收藏品吗? (我正在使用Devise和Simple Form gem)

这是我到目前为止所做的:

<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

1 个答案:

答案 0 :(得分:4)

当您在rails中设置一个或多个关系时,模型会获得_ids setter:

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

例如,这将设置用户1与具有ID 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 %>