ruby-on-rails – rails 4 collection_select多个嵌套属性未正确
发布时间:2020-12-17 02:47:57 所属栏目:百科 来源:网络整理
导读:我是rails的新手,我在使用collection_select保存连接表的嵌套属性时遇到问题.我有模型post,tag和post_tagging. post_tagging是一个连接表. 我想为每个帖子设置多个标签,所以我尝试通过collection_select使用多选,但是当我保存时,只将post_id插入到数据库中.
我是rails的新手,我在使用collection_select保存连接表的嵌套属性时遇到问题.我有模型post,tag和post_tagging. post_tagging是一个连接表.
我想为每个帖子设置多个标签,所以我尝试通过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,source: :post end post_tagging.rb(我在post_tagging模型中关闭了tag_id和post_id上的状态验证,因此我可以获得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 < ApplicationController def new @post = Post.new @post.post_taggings.build end def new_post_params params.require(:post).permit(:title,post_taggings_attributes: { :tag_id => [] }) end def update_post_params params.require(:post).permit(:title,post_taggings_attributes: [ { :tag_id => [] },:id,:_destroy ]) end end 视图/后/ new.html.erb <%= form_for(@post) do |f| %> <%= f.fields_for :post_taggings do | pt | %> <%= pt.label :post_taggings,"Tags" %><br /> <%= pt.collection_select(:tag_id,Tag.all,:name,{include_hidden: false},{multiple: true} ) %><br /> <% end %> HTML <select id="post_post_taggings_attributes_0_tag_id" multiple="multiple" name="post[post_taggings_attributes][0][tag_id][]"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> 当我保存表单时,我得到以下内容: 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","2014-12-13 12:22:19.791928"],["post_id",16],"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,{multiple: true} ) %><br /> <% end %> #in your controller def post_params params.require(:post).permit([:title,:tag_ids => []]) end 现在,而不是两个不同的允许参数列表,事情将适用于两者.删除标记将无需复杂. 请在您的操作中的所需位置替换允许的参数值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |