2011-07-15 2 views
2

を使用しました:は、どのようにフォームが、私は3つのモデル持っている別のコントローラ

Location 
belongs_to :user 
has_many :products, :product_dates 

ProductDate 
belongs_to :user, :location 
has_many :products 

Product 
belongs_to :user, :location, :product_date 

を、私は、ネストされた形式があります。

<%= form_for @location do |first| %> 
<%= f.fields_for :product_dates do |second| %> 
<%= second.fields_for :products do |third| %> 

を、私は2つのだけのコントローラを持っていますが、私のネストされたフォームのProductsControllerを使用しています:

def new 
    @location = Location.new 
    3.times do 
    product_date = @location.product_dates.build 
    4.times { product_date.products.build } 
    end 
end 

Products/INDEXにリダイレクトするためにこのネストされたフォームが必要なので、私のProductsControllerを使用したい私のLocationsControllerはロケーションを作成するためのものであり、多くの製品ではないため、Locations/Showではなく保存してください。どのように私はこれを達成するのですか?

注:私はRubyとRailsの経験はほとんどありません。

+4

あなたは '定義されてきたが、<%=のform_for @location行う|最初| %> '、これはLocationsControllerが必要だが、ProductsControllerが必要だと言う。 しかし、あなたのロジックフィッティングがそのコントローラにはるかに多いので、LocationsControllerを作成する必要があります。 –

+0

しかし、私は2つのフォーム、1つの場所(新しい/場所)と製品を作成する入れ子になったフォーム(製品/新)を作成するための1つがあります。どちらもform_for @locationを使用しますが、どちらも/ /新しい場所にリダイレクトします。私は製品が製品/インデックスにリダイレクトされることを希望したくありません。 – LearningRoR

答えて

1

form_forに別のコントローラを使用させたい場合:

<%= form_for @location, :url => products_path do |f| %> 

私の状況のようにネストされている場合は、あなたも私の子供フィールドは同じことをしています。

<%= f.fields_for :product_dates, :url => products_path do |date| %> 

<%= date.fields_for :products, :url => products_path do |product| %> 

は、私は自分の製品に戻す/ INDEXリダイレクト:

def create 
     @location = Location.new(params[:location]) 
     if @location.save 
      redirect_to :action => 'index', :notice => "Successfully created products." 
     else 
      render :action => 'new' 
     end 
    end 
+0

異なるコントローラを使用する信号は、基本的にリソース名の最後の単語ですか?最初のコントローラは「日付」に関連するコントローラを検索し、2番目のコントローラは「製品」に関連するコントローラを検索します。 –

1

1)あなたの代わりに、ネストされたルートを使用することができます。

resources :locations do 
    resources :product_dates 
    resources :products 
end 

2)モデルの場所をすべきaccepts_nested_attributes_forを持って

class Location < AR:BAse 
    accepts_nested_attributes_for :product_dates, :products 
end 

あなただけ初期化することができるので、子供たちは、オブジェクトを構築するべきではありません3)コントローラと親オブジェクトを保存すると、子供は自動的に保存されます

+0

これは私がProduct_datesコントローラを必要としていることを意味し、私の製品ルートはすべて削除されました。 – LearningRoR

+0

私はこれをやりたいことについてより多くの洞察を与えるために私の答えを編集しました。 – LearningRoR

関連する問題