0

新しいビューには 2 つのフォームがあります。1 つは製品用で、もう 1 つは写真用です。select.file フィールドを使用して写真をアップロードすると、これらはファイル create.js.erb による Ajax 呼び出しによって作成され、他のフィールドを製品に入力すると、別のボタンで作成されます。したがって、2 つのフォームと、それぞれを作成する 1 つの方法があります。

問題はIDです。私が見つけた解決策は、ユーザーが新しいビューに入る前にオブジェクトを作成することだったので、次のコードがあります:

製品のコントローラー:

def new
      @product = current_user.products.create
end

オブジェクト nil を作成します。これで、次のように、そのオブジェクトに Foto を作成できます。

絵画のコントローラー:

def create
   @product = Product.last
   @painting = @product.paintings.create(params[:painting])
end

問題は「@product = Product.last」という行です。編集アクションを試みると、新しいオブジェクトを作成しようとすると、最後の製品ではなく最後の製品に移動するため、これが正しい解決策ではないことはわかっています。実際の編集製品。

新しいアクションで現在の製品を見つけるにはどうすればよいですか???

どうもありがとう。

4

2 に答える 2

1

新しいオブジェクトの作成 (#new は GET 要求であり、破壊的な変更を行うべきではないため、新しいフォームを実際に表示します)

 def new
    @product = current_user.products.build
  end

新しいオブジェクトの作成

def create
  @product = current_user.products.build(params[:product])
  if @product.save
    redirect_to @product
  else
    render :new
  end
end

オブジェクトの編集フォームの表示

def edit
  @product = current_user.products.find(params[:id])
end

既存の製品の更新

def update
  @product = current_user.products.find(params[:id])
  if @product.update_attributes(params[:product])
    redirect_to @product
  else
     render :edit
  end
end

GET 要求 (新規および編集) がデータベースに変更を加えていないことがわかります。

(更新/作成) に対する 2 つの破壊的な要求 (PUT と POST) は、データベースに変更を加えます。

于 2012-10-30T21:08:10.467 に答える
0

一般的に行っていることはぎこちなく、おそらくコントローラーの新しいアクションを使用する最良の方法ではありません。

質問に答えるには、パラメーターで製品の ID を渡す必要があります。

絵画フォームを送信する方法に応じて、リクエストの本文または URL にパラメーターを追加する必要があります。そうすれば、次のようなことができるでしょう

絵画のコントローラー

def create
  @product = Product.find(params[:product_id]
  @painting = @product.paintings.create(params[:painting])
end

ビュー/フォームのコード スニペットを追加していただければ、おそらくより適切に対応できると思います。

于 2012-10-30T20:30:03.007 に答える