Rails 4:将复选框结果保存到序列化阵列

shr*_*roy 6 ruby checkbox ruby-on-rails form-helpers ruby-on-rails-4

我有一个Campaign带有channel列的模型.这channelserialized通过复选框存储一系列选定结果.

这是模特..

应用程序/模型/ campaign.rb

class Campaign < ActiveRecord::Base
    serialize :channels, Array
end
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)

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

意见/运动/ _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 %>
Run Code Online (Sandbox Code Playgroud)

我在Campaign对象中保存这些结果时遇到问题.

任何帮助都非常感谢.

San*_*San 22

首先,您提到了列名称channel,但您在Campaign模型中使用了其复数版本.由于您计划在此列中保存通道数组,因此我建议您将数据库中列的名称更改为channels.下面的所有代码都假定您将数据库列更改为channels.

由于您将channels属性序列化为a Array并且您的表单将该参数作为数组发送到控制器,因此您需要相应地更新您的campaign_params方法.

def campaign_params
  params.require(:campaign).permit(:name, :comment, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [], channels: [])
end
Run Code Online (Sandbox Code Playgroud)

现在,@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>
Run Code Online (Sandbox Code Playgroud)

说明

第一个参数check_box_tagname标签的属性.第二是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>
Run Code Online (Sandbox Code Playgroud)

controller将看到channelsPARAM作为选定值的阵列.

这应该适用于New和Edit表单.

  • 单词,解决方案代码,代码说明.也很有礼貌.可以这样请你们更多.0 / (2认同)