如何使用check_box_tag在Rails中创建或销毁has_many-trough关联

时间:2016-08-03 17:12:57

标签: ruby-on-rails forms checkbox associations

在我的Rails应用程序中,我有一个属于公司的广告系列。该公司有许多组,其中一个或多个组可以通过名为:general_connections的模型连接到该活动。

对于此广告系列,我尝试显示关联公司的组列表(带复选框)。选中一个复选框即可创建:general_connection,并取消选中该复选框,此特定:general_connection应为destroyed

型号:

class Company < ActiveRecord::Base
  has_many :campaigns
  has_many :groups
end

class Campaign < ActiveRecord::Base
  belongs_to :company
  has_many :general_connections
  has_many :groups, through: :general_connections
end

class Group < ActiveRecord::Base
  belongs_to :company
  has_many :general_connections
  has_many :campaigns, through: :general_connections
end

class GeneralConnection < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :group
  belongs_to :company
end

控制器:

#campaign_controller.rb /show
  def show
      @campaign = Campaign.find(params[:id])
    @company = Company.find(current_user.current_company)
    @main_groups = @company.groups
    @general_connections = @campaign.general_connections
    @groups = @campaign.groups
  end

#general_connection_controller.rb /connect_group_to_campaign
  def connect_group_to_campaign
    group = group.find(params[:group_id])
    @campaign = Campaign.find(params[:id])
    @campaign.general_connections.create(group: group)

    redirect_to :back
  end

#general_connection_controller.rb /disconnect_group_from_campaign
  def disconnect_group_from_campaign
    @general_connection = GeneralConnection.where("group_id = ? AND campaign_id = ?", params[:group_id], @campaign.id).first
    group = @general_connection.oneliner

    @general_connection.destroy

    redirect_to :back
  end

使用form_tag查看:

        <h5>Groups for this campaign</h5>
        <div class="row">
            <% @main_groups.each do |group| %>
                <%= form_tag connect_group_to_campaign_path do |f| %>
                <%= hidden_field_tag 'campaign_id', @campaign.id %>
                  <%= f.check_box_tag group.id, group.id, true %>
                <% end %>

                <%= form_tag disconnect_group_from_campaign_path do |f| %>
                <%= hidden_field_tag 'campaign_id', @campaign.id %>
                  <%= f.check_box_tag group.id, group.id, false %>
                <% end %>

            <% end %>
        </div>

我相信我在View的尝试可能很垃圾,但我只想先自己尝试一下。

我的问题是:

  1. 这可能吗?
  2. 如果是这样,我该如何撰写?
  3. 更新
    是否对@ Jeff的答案进行了测试:

    <%= form_for @campaign do |f| %>
    <div class="form-group">
        <ul>
            <% @main_groups.each do |group| %>  
                <li>
                <%= check_box_tag :group_id, group.id, @campaign.general_connections.include?(group) %>
                <%= group.title %>
                </li>
            <% end %>
        </ul>   
    </div>
    <div class="actions">
        <%= f.submit "Save groups", class: "btn waves-effect waves-light" %>
    </div>
    <% end %>
    

    但是没有显示checkboxes,我不确定这会如何为我的general_connections table添加一行。

1 个答案:

答案 0 :(得分:0)

我最近完成了一个与你描述的非常相似的功能。这里的代码对我来说证明是成功的,尽管它可能需要根据您的需求进行重大调整:

<%= form_for(@assignment) do |a| %>

  <%= a.label :name %>
  <%= a.text_field :name, class: 'form-control' %>

  <%= a.label :possible, "Points Possible" %>
  <%= a.text_field :possible, class: 'form-control' %>

  <%= a.label :priority %>
  <%= a.select(:priority, [0,1,2,3], :selected =>[2]) %>

  <% Assignment.each do |assignment| %>
     <%= check_box_tag :preassign_ids, assignment.id, 
          @assignment.preconditions.include?(assignment), :name => 'assignment[preassign_ids][]' %>
     <%= assignment.name %>
  <% end %>

  <%= a.submit "Submit", class: "btn btn-primary" %>
 <% end %>

此示例使用两种模型:第一种,&#34;分配&#34 ;;第二,一个名为的连接模型,&#34; Preconditions&#34;在分配之间创建关系。 Preconditions表包含两列:&#34; mainassign&#34;并且&#34;预先分配。&#34;这就是:preassign_ids发挥作用的地方。您需要与应用中的关联进行类似的工作。

在此代码中,单击复选框可创建将当前分配链接到另一个分配的前提条件。我还没有通过取消选中复选框来测试关系是否被破坏,但第一部分工作正常。

我自己很新,所以我不知道我的其他文件中的代码是否有用。如果您认为这种方法是您正在寻找的方法,我很乐意发布更多内容。