将复选框数组插入数据库

时间:2014-01-05 22:51:24

标签: ruby-on-rails ruby-on-rails-4 simple-form

我陷入困境,虽然我的数组参数被捕获,但无法将其插入数据库。我没有得到未经许可的参数错误或任何东西。插入数据库时​​,它无法识别数组。

我想做什么:捕获已检查的任何框,并将数据作为 单独的 行插入数据库。

这就是我所拥有的:

/订阅/类别/ 2

<div>
    <%= simple_form_for @subscription do |f| %>
        <div class="form-inputs">
            <%= f.hidden_field :dashboard_id, value: 1 %>
            <%= f.hidden_field :category_id, value: @category.id %>
            <%= f.collection_check_boxes :feed_id, Feed.where("category_id = ?", @category), :id, :name %>
        </div>
      <div class="form-actions">
        <%= f.button :submit %>
      </div>        
    <% end %>
</div>

CategoriesController

  def show
    @subscription = Subscription.new
  end

SubscriptionsController

def subscription_params
  params.require(:subscription).permit(:dashboard_id, :category_id, :feed_id => [])
end

提交时,这是控制台输出:

Processing by SubscriptionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Zw2VkwujDLQjV4krjPF8N1EiYo5L/XOrUwedlHCvwB0=", "subscription"=>{"dashboard_id"=>"1", "category_id"=>"2", "feed_id"=>["3", "4", ""]}, "commit"=>"Create Subscription"}
   (0.2ms)  BEGIN
  SQL (1.6ms)  INSERT INTO `subscriptions` (`category_id`, `created_at`, `dashboard_id`, `updated_at`) VALUES (2, '2014-01-06 02:17:41', 1, '2014-01-06 02:17:41')
   (116.6ms)  COMMIT
Redirected to http://localhost:3000/subscriptions/3
Completed 302 Found in 173ms (ActiveRecord: 119.3ms)

两个问题:

  1. 为什么我的feed_id数组还有额外的“”? (只有2个可能的复选框)
  2. 为什么我没有捕获数组以将其插入数据库?
  3. 谢谢!

2 个答案:

答案 0 :(得分:0)

您的数组未插入数据库的原因是Active Record当前不支持Postgresql数组类型。为了将这些作为单独的行插入,复选框需要表示为模型的单个实例。

可能就像......

Category < ActiveRecord::Base
    has_many: feeds
    ...
end  

Feed < ActiveRecord::Base  
    belongs_to: category
    ...
end  

现在这也意味着您需要使用form_tag帮助程序而不是form_for。这将允许您创建由多个单独对象组成的复合表单。插入这只意味着迭代并插入每个对象;给你单独的行。希望这会有所帮助。

答案 1 :(得分:0)

对于任何想知道如何做到这一点的人来说,这是我提出的一个解决方案。我的第一篇文章中的所有内容都保持不变。在我的SubscriptionsController(从中创建表单),这是我的创建操作:

  def create
    dashboard = params[:subscription][:dashboard_id]
    category = params[:subscription][:category_id]
    feed = params[:subscription][:feed_id]

    @subscription = feed.map { |subscribe| Subscription.create(dashboard_id: dashboard, category_id: category, feed_id: subscribe) }
  end

按宣传方式工作。如果有人因某种原因认为我忽略了这是一个可怕的想法,请发表评论。