如何使用 check_box_tag 在 Rails 中创建或销毁 has_many-trough 关联
How to use a check_box_tag to create or destroy a has_many-trough association in Rails
在我的 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
中的尝试可能是垃圾,但我只想自己先尝试一下。
我的问题是:
- 这可能吗?
- 如果是这样,我该如何撰写?
更新:
用@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
.
中添加一行
我最近完成了一个与您描述的非常相似的功能。这里的代码对我来说是成功的,尽管它可能需要根据您的需要进行重大调整:
<%= 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 %>
这个例子使用了两个模型:第一个,"Assignments";其次,一个名为 "Preconditions" 的连接模型创建分配之间的关系。 Preconditions table 包括两列:"mainassign" 和 "preassign." 所以这就是 :preassign_ids 发挥作用的地方。您需要对应用中的关联做一些类似的工作。
在此代码中,单击复选框创建一个将当前分配链接到另一个分配的先决条件。我还没有测试过取消选中复选框是否会破坏关系,但第一部分工作正常。
我自己也是新手,所以我不知道我的其他文件中的代码是否有帮助。如果您认为这种方法正是您所需要的,我很乐意 post。
在我的 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
中的尝试可能是垃圾,但我只想自己先尝试一下。
我的问题是:
- 这可能吗?
- 如果是这样,我该如何撰写?
更新:
用@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
.
我最近完成了一个与您描述的非常相似的功能。这里的代码对我来说是成功的,尽管它可能需要根据您的需要进行重大调整:
<%= 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 %>
这个例子使用了两个模型:第一个,"Assignments";其次,一个名为 "Preconditions" 的连接模型创建分配之间的关系。 Preconditions table 包括两列:"mainassign" 和 "preassign." 所以这就是 :preassign_ids 发挥作用的地方。您需要对应用中的关联做一些类似的工作。
在此代码中,单击复选框创建一个将当前分配链接到另一个分配的先决条件。我还没有测试过取消选中复选框是否会破坏关系,但第一部分工作正常。
我自己也是新手,所以我不知道我的其他文件中的代码是否有帮助。如果您认为这种方法正是您所需要的,我很乐意 post。