4

레일을 처음 사용하여 collection_select를 사용하여 조인 테이블의 중첩 된 특성을 저장하는 데 문제가 있습니다. 나는 모델 post, tag, post_tagging을 가지고있다. post_tagging은 조인 테이블입니다.레일 4 collection_select 여러 개의 중첩 된 특성이 제대로 저장되지 않습니다.

collection마다 여러 개의 태그를 설정하여 collection_select를 통해 다중 선택을 시도했지만 post_id 만 저장하면 데이터베이스에 삽입됩니다. 아래는 내 코드와 로그입니다.

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의 로그를 얻을 수있는 post_tagging 모델 tag_id 및 post_id를에 존재 유효성 검사를 해제 Post.rb .)

class PostTagging < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 

    #validates :post_id, presence: true 
    #validates :tag_id, presence: true 
end 

posts_controller.rb (약칭)

,745,151 나는 다음과 같은 얻을 형태로 저장하면개
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 

보기/후 /는

<%= 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, :id, :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> 

는 new.html.erb :

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 

답변

6

{ :tag_id => [] } 

에서 강한 PARAMS를 변경하는 경우는 단일 선택과 함께 작동하기 때문에 나는 가까이있어 생각합니다.

두 가지 다른 허용 된 매개 변수 대신 현재 두 가지 모두 사용할 수 있습니다. 태그를 제거하면 복잡성없이 작동합니다.

허용 된 매개 변수 값을 작업의 원하는 위치로 바꾸십시오.

+2

': tag_ids '대신': tag_ids => []'를 허용해야합니다. – Nermin

+0

감사합니다. 방금 업데이트했습니다. 당신을 위해 +1 : – Rubyrider

+0

@Rubyrider는 답변을 주셔서 감사합니다. 폼을 tag_ids로 업데이트하고 작성/수정합니다. # ' – Justin