2014-03-05 1 views
2

나는이 내 응용 프로그램에서 다음과 같은 모델는 중첩없이 폼 collection_select와 다형성 협회 레일

class User < ActiveRecord::Base 
has_many :articles 
has_many :tour_companies 
has_many :accomodations 
end 

class Articles < ActiveRecord::Base 
belongs_to :user 
belongs_to :bloggable, :polymorphic => true 
end 

class TourCompany < ActiveRecord::Base 
belongs_to :user 
has_many :articles, :as => :bloggable 
end 

class Accommodation < ActiveRecord::Base 
belongs_to :user 
has_many :articles, :as => :bloggable 
end 

이제 내 문제는 내가 기사를 작성하고 선택 양식 collection_select을 사용할 수 있도록 사용자가 로그인 할 것입니다 어떤 기사를 자신의 투어 회사 또는 숙박 시설과 연관시켜야하는지, 레일 4에서 어떻게해야합니까? 양식 수집 선택에서 블로깅 유형과 ID를 어떻게 선택합니까? 중첩 된 자원을 원하지 않는다.

답변

5

나는 마침내 그것을 할 수 있었다. 내가보기/기사/_form.html.erb

<div class="row"> 
<% bloggable_collection = TourCompany.all.map{|x| [x.title, "TourCompany:#{x.id}"]} + 
          Accomodation.all.map{|x| [x.title, "Accomodation:#{x.id}]} 
%> 
<p>Select one of your listing this article is associated with</p> 
<%= f.select(:bloggable, bloggable_collection,:selected =>"#{f.object.bloggable_type}:# {f.object.bloggable_id}") %> 
</div> 

그런 다음 기사 컨트롤러

#use regular expression to match the submitted values 
def create 
bloggable_params = params[:article][:bloggable].match(/^(?<type>\w+):(?<id>\d+)$/) 
params[:article].delete(:bloggable) 

@article = current_user.articles.build(article_params) 
@article.bloggable_id   = bloggable_params[:id] 
@article.bloggable_type  = bloggable_params[:type] 
if @article.save 
    redirect_to admin_root_url, :notice => "Successfully created article" 
else 
    render 'new', :alert => "There was an error" 
end 
end 

그리고 그것은 작동합니다에서의 그것을 어떻게 여기!