Rails 4:将复选框结果保存到序列化数组
Rails 4: Save Checkbox Results to Serialized Array
我有一个带有 channel
列的 Campaign
模型。此 channel
将存储一个 serialized
数组,其中包含通过复选框选择的结果。
这是模型..
app/models/campaign.rb
class Campaign < ActiveRecord::Base
serialize :channels, Array
end
app/controllers/compaigns_controller.rb
class CampaignsController < ApplicationController
def index
@campaigns = Campaign.all.order("created_at DESC")
end
def new
@campaign = Campaign.new
end
def create
@campaign = Campaign.new(campaign_params)
if @campaign.save
zip = Uploadzip.find(params[:uploadzip_id])
zip.campaign = @campaign
zip.save
flash[:success] = "Campaign Successfully Launched!"
redirect_to @campaign
else
flash[:error] = "There was a problem launching your Campaign."
redirect_to new_campaign_path
end
end
def show
@campaign = Campaign.includes(:program, :uploadzip, :channel, :plan, :uploadpdfs).find(params[:id])
end
private
def campaign_params
params.require(:campaign).permit(:name, :comment, :channel, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [])
end
end
带有复选框的表单部分..
views/campaigns/_target.rb
<%= form_for @campaign, url: {action: "create"} do |f| %>
...
<label class="right-inline">
<%= f.label :channel, "Distribution Channel", class: "right-label" %>
</label>
<ul class="channel-list">
<% ["Folder", "Fax", "Email"].each do |channel| %>
<li><%= check_box_tag :channel, channel %> <%= channel %>
<% end %></li>
</ul>
...
<% end %>
我在将这些结果保存到 Campaign 对象中时遇到问题。
非常感谢任何帮助。
首先,您提到列名是channel
,但您在Campaign
模型中使用了它的复数形式。由于您打算在此列中保存通道数组,因此我建议您将数据库中的列名称更改为 channels
。下面的所有代码都假定您将数据库列更改为 channels
.
由于您正在将 channels
属性序列化为 Array
并且您的表单将该参数作为数组发送到控制器,因此您需要相应地更新您的 campaign_params
方法.
def campaign_params
params.require(:campaign).permit(:name, :comment, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [], channels: [])
end
现在,@campaign
表单的相关部分应如下所示:
<ul class="channels-list">
<% ["Folder", "Fax", "Email"].each do |channel| %>
<li><%= check_box_tag "campaign[channels][]", channel, @campaign.channels.include?(channel), id: "campaign_channels_#{channel}" %> <%= channel %></li>
<% end %>
</ul>
说明
check_box_tag
中的第一个参数是标签的 name
属性。其次是 value
属性。第三个是布尔值,用于指示复选框在最初呈现时是否会被选中。这将有助于以 edit
形式显示当前选择。
请注意,我明确提供了 id
属性。如果我们不这样做,所有三个复选框将具有相同的 id(从它们的名称派生),这将是无效的 HTML 因为 id 不应该重复。
生成的 HTML 应如下所示:
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Folder" value="Folder" /> Folder</li>
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Fax" value="Fax" /> Fax</li>
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Email" value="Email" /> Email</li>
controller
会将 channels
参数视为所选值的数组。
这应该适用于新建和编辑表单。
我有一个带有 channel
列的 Campaign
模型。此 channel
将存储一个 serialized
数组,其中包含通过复选框选择的结果。
这是模型..
app/models/campaign.rb
class Campaign < ActiveRecord::Base
serialize :channels, Array
end
app/controllers/compaigns_controller.rb
class CampaignsController < ApplicationController
def index
@campaigns = Campaign.all.order("created_at DESC")
end
def new
@campaign = Campaign.new
end
def create
@campaign = Campaign.new(campaign_params)
if @campaign.save
zip = Uploadzip.find(params[:uploadzip_id])
zip.campaign = @campaign
zip.save
flash[:success] = "Campaign Successfully Launched!"
redirect_to @campaign
else
flash[:error] = "There was a problem launching your Campaign."
redirect_to new_campaign_path
end
end
def show
@campaign = Campaign.includes(:program, :uploadzip, :channel, :plan, :uploadpdfs).find(params[:id])
end
private
def campaign_params
params.require(:campaign).permit(:name, :comment, :channel, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [])
end
end
带有复选框的表单部分..
views/campaigns/_target.rb
<%= form_for @campaign, url: {action: "create"} do |f| %>
...
<label class="right-inline">
<%= f.label :channel, "Distribution Channel", class: "right-label" %>
</label>
<ul class="channel-list">
<% ["Folder", "Fax", "Email"].each do |channel| %>
<li><%= check_box_tag :channel, channel %> <%= channel %>
<% end %></li>
</ul>
...
<% end %>
我在将这些结果保存到 Campaign 对象中时遇到问题。
非常感谢任何帮助。
首先,您提到列名是channel
,但您在Campaign
模型中使用了它的复数形式。由于您打算在此列中保存通道数组,因此我建议您将数据库中的列名称更改为 channels
。下面的所有代码都假定您将数据库列更改为 channels
.
由于您正在将 channels
属性序列化为 Array
并且您的表单将该参数作为数组发送到控制器,因此您需要相应地更新您的 campaign_params
方法.
def campaign_params
params.require(:campaign).permit(:name, :comment, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [], channels: [])
end
现在,@campaign
表单的相关部分应如下所示:
<ul class="channels-list">
<% ["Folder", "Fax", "Email"].each do |channel| %>
<li><%= check_box_tag "campaign[channels][]", channel, @campaign.channels.include?(channel), id: "campaign_channels_#{channel}" %> <%= channel %></li>
<% end %>
</ul>
说明
check_box_tag
中的第一个参数是标签的 name
属性。其次是 value
属性。第三个是布尔值,用于指示复选框在最初呈现时是否会被选中。这将有助于以 edit
形式显示当前选择。
请注意,我明确提供了 id
属性。如果我们不这样做,所有三个复选框将具有相同的 id(从它们的名称派生),这将是无效的 HTML 因为 id 不应该重复。
生成的 HTML 应如下所示:
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Folder" value="Folder" /> Folder</li>
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Fax" value="Fax" /> Fax</li>
<li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Email" value="Email" /> Email</li>
controller
会将 channels
参数视为所选值的数组。
这应该适用于新建和编辑表单。