Rails 5:如何通过fields_for中的strong_params传递collection_select值?

时间:2017-01-26 22:09:42

标签: ruby-on-rails ruby forms ruby-on-rails-4 collection-select

我已经尝试了所有视频和文章,仍然无法找到将fields_for collection_select值设置为strong_params中的白名单的解决方案。我花了好几天试图解决这个问题(并问了很多人)。如果有人可以花时间来帮助我,我会非常感激!

我在List和Topic之间有多对多的关联,List_Topic充当连接模型。使用form_for,我为List的实例(@list)创建了一个表单,然后创建了fields_for:list_topics。在字段中,我创建了一个collection_select,由Topic.all填充。

<br>
 <%= form_for(@list) do |f| %>
  <%= f.label :subject %>
  <%= f.text_field :subject %>
<br>
<br>

 <%= f.fields_for :list_topics do |ff| %>
  <%= ff.label "Choose a Topic:"  %><br>
  <%= ff.label :content %>
  <%= ff.text_field :content %>
  <%= ff.collection_select(:id, @all_topics, :id, :name, {}, {multiple: true}) %>
 <% end %>

 <%= f.submit %>
<% end %>

在我的列表控制器中,我有:

class ListsController < ApplicationController

  def new
    @list = List.new
    @all_topics = Topic.all
    @list.list_topics.build 
  end

  def create
    @list = List.new(list_params)
  end

private

  def list_params
    params.require(:list).permit(:subject, :list_topics_attributes =>    [:topic, :content, :topic_ids, :id, :ids])
  end  

end

fields_for表单中的参数传递为:

list_topics_attributes"=>{"0"=>{"content"=>"Hey", "id"=>["", "2"]}}} 

虽然strong_params被列入@list列表,但我能够通过:list_topics_attributes获取custom_attribute编写器以识别:fields_for中的:content params,我无法将strong_params中的:id参数列入白名单无论我尝试什么或我关注的文章/视频,都会通过collection_select传递。他们根本就没有出现。

我这里也有git repo。表单在lists / new

https://github.com/jwolfe890/Top5/blob/master/app/views/lists/new.html.erb

非常感谢您的任何见解!

1 个答案:

答案 0 :(得分:3)

有人就在这里,但他的评论看起来像是被删除了。我只是想感谢他,因为他的解决方案有效:

params.require(:list).permit(:subject, :list_topics_attributes => [ :content, id: []])

基本上,由于id位于list_topics_attributes散列中的数组中,因此必须在list_topics_attributes散列中传递:id字段,并且THAT:id字段也需要为其分配一个数组。

谢谢!