1

私はすべて間違ったルーティングを考えていると思います。製品と写真の2つのモデル設定があります。製品has_many:photos、および写真belongs_to:product。

製品には完全な足場があり、写真には私が取り組んでいるphotos_controllerがあります。

ルート.rbには次 のものがあります:(resources :productsスキャフォールドによって生成されます)

写真は製品のネストされたリソースであるため、これを次のように変更しました。

resources :products do
    resources :photos
  end

そして最後に:

root :to => "products#index"

幸いにもレーキルートが吐き出されます:

  products GET             {:controller=>"products", :action=>"index"}
  products POST            {:controller=>"products", :action=>"create"}
  new_product GET          {:controller=>"products", :action=>"new"}
  edit_product GET         {:controller=>"products", :action=>"edit"}
  product GET              {:controller=>"products", :action=>"show"}
  product PUT              {:controller=>"products", :action=>"update"}
  product DELETE           {:controller=>"products", :action=>"destroy"}
  product_photos GET       {:controller=>"photos", :action=>"index"}
  product_photos POST      {:controller=>"photos", :action=>"create"}
  new_product_photo GET    {:controller=>"photos", :action=>"new"}
  edit_product_photo GET   {:controller=>"photos", :action=>"edit"}
  product_photo GET        {:controller=>"photos", :action=>"show"}
  product_photo PUT        {:controller=>"photos", :action=>"update"}
  product_photo DELETE     {:controller=>"photos", :action=>"destroy"}
  products GET             {:controller=>"products", :action=>"index"}
  products POST            {:controller=>"products", :action=>"create"}
  new_product GET          {:controller=>"products", :action=>"new"}
  edit_product GET         {:controller=>"products", :action=>"edit"}
  product GET              {:controller=>"products", :action=>"show"}
  product PUT              {:controller=>"products", :action=>"update"}
  product DELETE           {:controller=>"products", :action=>"destroy"}
  root                     {:controller=>"products", :action=>"index"}

つまり、products / newのフォームはproducts#createにPOSTし、次にphotos#newにリダイレクトし、対応するphotos /new.html.erbによって生成されたproduct_photosをアップロードするためのフォームがあります。これはphotos#にPOSTします。作成しますか?

product_controller.rb内:

def create
    @product = Product.new(params[:product])

    respond_to do |format|
      if @product.save
        redirect_to new_product_photo_path, :notice => 'Product was successfully created.'
      else
        render :action => "new"
      end
    end
  end

およびphotos_controller.rb(今のところ):

def new
    @photo = Photo.new
  end

だからなぜああなぜああなぜ私は得るのですか?

Routing Error

No route matches {:controller=>"photos", :action=>"new"}

rakeルートが明確に私がそう言っているとき、私はphotos_controller、photos_controllerに新しいアクションがあり、new_product_photo_pathは明らかに正しい方向に進むように求めていますか?<h1>Photos</h1>(私はまた、何かをレンダリングするための簡単なphotos / new.html.erbを持っています)。

私はこれについてすべて間違った方法で考えている、または設定より規約で私が見ることができない誤りを犯したと結論付けることしかできません。

誰か?

よろしくお願いします、アダム

4

1 に答える 1

0

更新された回答:

ネストされたリソースを使用するということは、(この場合)製品のコンテキストでのみ新しい写真を作成できることを意味します。つまり、アプリケーションは、作成する写真がどの製品に属しているかを知る必要があります。

リダイレクトの場合、これは、製品オブジェクトをパラメータとして以下に追加する必要があることを意味しますnew_product_photo_path

redirect_to new_product_photo_path(@product)

元の答え:

これは、ネストされたリソースにしたためです。/products/1/photos/newおそらく動作します。を介して新しい写真を作成できるようにする/photos/new場合は、「ネストされていない」リソースも追加する必要があります。

于 2010-10-23T15:03:26.963 に答える