rails 4 collection_select多个嵌套属性未正确保存

我是rails的新手,我在使用collection_select保存连接表的嵌套属性时遇到问题。 我有模型post,tag和post_tagging。 post_tagging是一个连接表。

我想为每个post设置多个标签,所以我尝试通过collection_select使用多选,但是当我保存时,只将post_id插入到数据库中。 下面是我的代码和日志。

Post.rb

class Post < ActiveRecord::Base has_many :post_taggings, foreign_key: :post_id, dependent: :destroy has_many :tags, through: :post_taggings, source: :tag accepts_nested_attributes_for :post_taggings, reject_if: :all_blank, allow_destroy: true end 

Tag.rb

 class Tag < ActiveRecord::Base has_many :post_taggings, foreign_key: :tag_id, dependent: :destroy has_many :posts, through: :post_taggings, source: :post end 

post_tagging.rb(我在post_tagging模型中关闭了tag_id和post_id的状态validation,因此我可以获得POST的日志。)

 class PostTagging < ActiveRecord::Base belongs_to :post belongs_to :tag #validates :post_id, presence: true #validates :tag_id, presence: true end 

posts_controller.rb(缩写)

 class PostsController  [] }) end def update_post_params params.require(:post).permit(:title, post_taggings_attributes: [ { :tag_id => [] }, :id, :_destroy ]) end end 

视图/后/ new.html.erb

   

HTML

  1 2 3 4 5 6 7 8 9 10  

当我保存表单时,我得到以下内容:

 Started POST "/posts" for 127.0.0.1 at 2014-12-13 04:22:19 -0800 Processing by PostsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"DaeMJb5b4PcLUz2YfQCjYk1r7pzcMd3NOmhYwEExz2U=", "post"=>{"title"=>"The Title", "post_taggings_attributes"=>{"0"=>{"tag_id"=>["1", "2", "6"]}}}, "commit"=>"Create Post"} (0.1ms) begin transaction SQL (0.5ms) INSERT INTO "posts" ("created_at", "title", "updated_at") VALUES (?, ?, ?) [["created_at", "2014-12-13 12:22:19.789055"], ["title", "The Title"], ["updated_at", "2014-12-13 12:22:19.789055"]] SQL (0.4ms) INSERT INTO "post_taggings" ("created_at", "post_id", "updated_at") VALUES (?, ?, ?) [["created_at", "2014-12-13 12:22:19.791928"], ["post_id", 16], ["updated_at", "2014-12-13 12:22:19.791928"]] (2.2ms) commit transaction Redirected to http://localhost:3000/posts/16 Completed 302 Found in 27ms (ActiveRecord: 3.3ms) 

由于它不起作用我知道我做错了什么。 我也不相信编辑案例会起作用。

我觉得我很接近,因为如果我改变了强大的参数,它可以用一个选择

 { :tag_id => [] } 

 :tag_id 

我更喜欢这样方便的方式。

  # in your form <%= form_for(@post) do |f| %> ## your other fields <%= f.collection_select(:tag_ids, Tag.all, :id, :name, {include_hidden: false}, {multiple: true} ) %>
<% end %> #in your controller def post_params params.require(:post).permit([:title, :tag_ids => []]) end

现在,而不是两个不同的允许参数列表,事情将适用于两者。 删除标记将无需复杂。

请在您的操作中的所需位置替换允许的参数值。