【问题标题】:Rails 4: Save Checkbox Results to Serialized ArrayRails 4:将复选框结果保存到序列化数组
【发布时间】:2015-08-29 02:06:53
【问题描述】:

我有一个带有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

带有复选框的表单部分..

观看次数/广告系列/_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 对象中时遇到问题。

非常感谢任何帮助。

【问题讨论】:

  • 首先我认为你each 循环是错误的。在每个循环中,您创建一个 &lt;li&gt;,而您只有一个 &lt;/li&gt; 退出循环。

标签: ruby-on-rails ruby ruby-on-rails-4 checkbox form-helpers


【解决方案1】:

首先,您提到列名是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>

controllerchannels 参数视为选定值的数组。

这应该适用于新建和编辑表单。

【讨论】:

  • 这行得通!感谢您的好评。非常透彻且易于理解。正是我需要的。
  • 单词,解决方案代码,代码解释。也很有礼貌。可以请更多的你。 0/
  • 对于值始终存在的场景,您是否有一个很好的解决方案,只是“真”或“假”的问题?
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 2016-01-15
  • 2010-11-14
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2016-03-07
相关资源
最近更新 更多