0

これは簡単に解決できると確信している質問であり、一部は私自身の知識不足に起因するものですが、少し検索を行ったところ、問題の適切な解決策がわかりません。

私の状況では、多くのReviewオブジェクトを持つクラスProductがあります。レビューもUsersに属します。モデルを正しく定義したと仮定すると、送信時に特定のレビューを特定の製品に結び付けるために、 :product_id変数をレビューに正しく渡す方法を理解するのに苦労しています。

これまでのところ、製品情報とlink_toを の形式で表示するビューがあり<%= link_to 'Review Product', new_review_path(:product_id => @product.id) %>ます。URL がhttp://localhost:3000/reviews/new?product_id=1として表示されるため、新しいレビューを追加するための結果のビュー フォーム (その製品用であることを意図したもの) は、少なくともある程度正しいように見えます。前述のように、事前に検索を行いましたが、私のような質問に対する同様の回答が提供されましたが、@reviewインスタンス変数の値を表示すると、各プロパティが nil になるため、問題は解決しませんでした。

私のreviews_controller.rbファイルでは、次のようなことを行うことで、少なくとも新しいアクションのフォーム内でこれらの変数を割り当てることができます。

@review = Review.new(:product_id => params[:product_id])

同様のことを行い、 current_user変数 (devise gem によって処理される)を渡すことで、 user_id変数を割り当てることもできます。Rails が採用する createアクションは、通常、私が読んだすべてのものに基づいて、変数の新しいインスタンスを作成することを認識しています。ただし、これを行うと、フォームに入力した変数を除いてデータが失われます。技術的に言えば、createアクションでcurrent_user変数を渡すことができるはずですが、product 変数を渡すことができません (または渡す方法がわかりません)。価値のあることとして、私は現在、ネストされたルートを使用していませんが、それが直接的な解決策であるかどうかはわかりません.

この問題を解決するために私ができることをよりよく理解している人がいれば、助けていただければ幸いです。ほのめかしたように、それは素人の間違いだと確信しています。

PS私はそれを説明する最善の方法がわからないので、質問の言葉遣いがぎこちない場合はお詫び申し上げます.

4

2 に答える 2

0

ネストされたリソース ルートは、おそらく最善の方法です。
@PhilipHallstromの方法は要素で機能しますが、 Restfulアプローチformを探している場合:

# Add nested resource route 
# /config/routes.rb
resources :products do
    resources :reviews
end


# In your 'products/show.erb.html'; @product will be the instance you want to review
<%= link_to 'Review Product', new_product_review_path(@product) %> # gets you to ReviewController#new

# In your ReviewsController#new
@product = Product.find(params[:product_id])
@review = @product.reviews.new #this should have product_id


# In your 'reviews/new.erb.html'
<% form_for [ @product, @review ] %> # gets you to ReviewController#create


# In your ReviewsController#create
@product = Product.find(params[:product_id])
@review = @product.reviews.new(params[:review]) # params from the previous form
@review.user = current_user
@review.save

機能しないフォームパラメーターを通過current_userまたは通過する限り。@product技術的には、実際の Ruby オブジェクトを HTTP 経由で渡すことはできません。

current_userコントローラーにはまだ存在するので意味がなく、セキュリティに悪い.

@productを使用して、コントローラーから DB にクエリを実行する必要があります。product_id

于 2012-12-09T13:38:05.773 に答える
0

Qumara が提案するようにネストされたルートを使用しない場合 (そして私も同意します)、作成アクションで使用できるように、以下を app/views/reviews/new.html.erb に追加するように設定する必要があります。

<%= r.hidden_field :product_id %>

もちろん、これは、製品 ID を知っていれば、フォームをハッキングして、希望する製品にレビューを設定できることを意味することを覚えておいてください。それで、あなたはそれについて考えたいと思うかもしれません...

于 2012-11-30T22:57:25.277 に答える