복붙노트

[RUBY-ON-RAILS] 3 레일 : 여러 선택은 협회를 통해 has_many와 함께

RUBY-ON-RAILS

3 레일 : 여러 선택은 협회를 통해 has_many와 함께

여러 개의 선택 한 후 여러 카테고리를 선택할 수있는 가능성을 싶어.

나는 다음 모델을 가지고 : 포스트, 종류와 PostCategory을.

class Post < ActiveRecord::Base
  has_many :post_categories
  has_many :categories, :through => :post_categories
end

class Category < ActiveRecord::Base
  has_many :post_categories
  has_many :posts, :through => :post_categories
end

class PostCategory < ActiveRecord::Base
  has_one    :post
  has_one    :category
  belongs_to :post      # foreign key - post_id
  belongs_to :category  # foreign key - category_id
end

내 컨트롤러에서 나는 @post = Post.new 같은 있습니다. 나는 몇 가지 카테고리를 만들었습니다.

그리고보기에 내가 가진 :

<%= form_for @post do |f| %>
    <%= f.text_field :title %>
    <%= f.select :categories, :multiple => true %>
    <%= f.submit %>
<% end %>

그리고 ... 어디 내 카테고리입니까? 나는 옵션을 선택 만 "다수"가 있습니다. 나는 내 양식과 그것의 뭔가 잘못 생각합니다.

해결법

  1. ==============================

    1.죄송 죽은자를 부활,하지만 난 하나가 기본 컨트롤러 액션 코드를 사용하고 has_many의 ActiveModel 세터 논리를 사용할 수 있습니다 훨씬 더 간단한 해결책을 발견합니다. 예, 그것은 완전히 마법입니다.

    죄송 죽은자를 부활,하지만 난 하나가 기본 컨트롤러 액션 코드를 사용하고 has_many의 ActiveModel 세터 논리를 사용할 수 있습니다 훨씬 더 간단한 해결책을 발견합니다. 예, 그것은 완전히 마법입니다.

    <%= f.select :category_ids, Category.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %>
    

    특히, 사용 : category_ids (또는 : your_collection_ids)를 매개 변수 이름은 자동적으로 호출에 레일을 말할 것이다 @ post.category_ids = PARAMS [: 포스트] : category_ids]를 기본 제어기 / 지지체 및 # 만들기 #UPDATE 코드를 변경하지 않고, 따라서, 해당 포스트에 대한 모든 카테고리를 설정.

    아, 그리고이 has_many와 함께 작동 :를 통해 무언가를 : something_else 자동으로 모델에 합류 관리. 멋진 일어 나니.

    대신 category_ids : 그래서 OP에서, 단지에 필드 / 매개 변수 이름을 변경 범주를.

    이것은 또한 자동으로 편집 양식에 때 강조로 모델의 선택 범주 선택 필드를 채울 것입니다.

    참고 :

    나는이를 발견 has_many의 API 문서에서.

    또한 양식 도우미 가이드의 경고는 적절한 양식 필드 / 매개 변수 이름을 사용하지 않는이 "유형 불일치"를 설명합니다.

    적절한 양식 필드 / 매개 변수 이름을 사용하면 새로운 편집 형태를 건조 할 수 있으며 레일 방식으로 격려로, 얇은 컨트롤러를 유지한다.

    레일 4 강한 매개 변수에 대한주의 :

    def post_params
      params.require(:post).permit(:title, :body, category_ids: [])
    end
    
  2. ==============================

    2.최종 해결책이 게시물에 카테고리를 구성, 나는 그것이 유용하게 사용될 수 있기를 바랍니다.

    최종 해결책이 게시물에 카테고리를 구성, 나는 그것이 유용하게 사용될 수 있기를 바랍니다.

    여러 우리의 필요에 select_tag을 사용하려면 :

    <%= select_tag "categories", options_from_collection_for_select(Categories.all, 'id', 'name'), :multiple => true %>
    

    또는 f.select (! Tigraine와 브렌트 많은 덕분에), 그것은 더 우아한 방법 :

    <%= f.select :categories, Category.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %>
    

    우리의 컨트롤러의 생성 작용에서 우리는해야합니다 :

    def create
       @post = Post.new(params[:post])
    
    if @post.save
    
      params[:categories].each do |categories|
         categories = PostCategory.new(:category_id => categories, :post_id => @post.id)
         if categories.valid?
           categories.save
         else
           @errors += categories.errors
         end
      end
      redirect_to root_url, :notice => "Bingo!"
    else
      render "new"
    end
    end
    
  3. ==============================

    3.당신이 필요한 것은 선택에 대한 옵션의 목록입니다 :

    당신이 필요한 것은 선택에 대한 옵션의 목록입니다 :

    <%= f.select :category_id, Category.all.collect {|x| [x.name, x.id]}, :multiple => true %>
    
  4. ==============================

    4.Tigraine 거의 그것을했다,하지만 당신은 추가 빈 해시를 지정해야합니다 :

    Tigraine 거의 그것을했다,하지만 당신은 추가 빈 해시를 지정해야합니다 :

    <% = f.select : CATEGORY_ID, Category.all.collect {| X | [x.name, x.id]}, {}, : 다중 => 진정한 %>

  5. ==============================

    5.@post가 ID를 가지고 있지 않기 때문에 아무런 관계가없는 것처럼에서 힘이 범주를 표시하지. 당신은 같은 @post 뭔가에 구축을 통과해야

    @post가 ID를 가지고 있지 않기 때문에 아무런 관계가없는 것처럼에서 힘이 범주를 표시하지. 당신은 같은 @post 뭔가에 구축을 통과해야

     @post = Post.new(:categories => Category.all)
    
  6. from https://stackoverflow.com/questions/8826407/rails-3-multiple-select-with-has-many-through-associations by cc-by-sa and MIT license