[RUBY-ON-RAILS] 3 레일 : 여러 선택은 협회를 통해 has_many와 함께
RUBY-ON-RAILS3 레일 : 여러 선택은 협회를 통해 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.죄송 죽은자를 부활,하지만 난 하나가 기본 컨트롤러 액션 코드를 사용하고 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.최종 해결책이 게시물에 카테고리를 구성, 나는 그것이 유용하게 사용될 수 있기를 바랍니다.
최종 해결책이 게시물에 카테고리를 구성, 나는 그것이 유용하게 사용될 수 있기를 바랍니다.
여러 우리의 필요에 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.당신이 필요한 것은 선택에 대한 옵션의 목록입니다 :
당신이 필요한 것은 선택에 대한 옵션의 목록입니다 :
<%= f.select :category_id, Category.all.collect {|x| [x.name, x.id]}, :multiple => true %>
-
==============================
4.Tigraine 거의 그것을했다,하지만 당신은 추가 빈 해시를 지정해야합니다 :
Tigraine 거의 그것을했다,하지만 당신은 추가 빈 해시를 지정해야합니다 :
<% = f.select : CATEGORY_ID, Category.all.collect {| X | [x.name, x.id]}, {}, : 다중 => 진정한 %>
-
==============================
5.@post가 ID를 가지고 있지 않기 때문에 아무런 관계가없는 것처럼에서 힘이 범주를 표시하지. 당신은 같은 @post 뭔가에 구축을 통과해야
@post가 ID를 가지고 있지 않기 때문에 아무런 관계가없는 것처럼에서 힘이 범주를 표시하지. 당신은 같은 @post 뭔가에 구축을 통과해야
@post = Post.new(:categories => Category.all)
from https://stackoverflow.com/questions/8826407/rails-3-multiple-select-with-has-many-through-associations by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 파괴와 삭제의 차이 (0) | 2020.02.11 |
---|---|
[RUBY-ON-RAILS] ActionController :: InvalidAuthenticityToken (0) | 2020.02.11 |
[RUBY-ON-RAILS] 레일에서 데이터베이스를 시드하는 가장 좋은 방법은 무엇입니까? (0) | 2020.02.11 |
[RUBY-ON-RAILS] 어떻게에게 Heroku에 초기화되지 않은 일정 레이크 :: DSL의 문제를 해결하기 위해? (0) | 2020.02.11 |
[RUBY-ON-RAILS] 레일에서 여러 데이터베이스 (0) | 2020.02.11 |