2

私は次の関係に 2 つのモデルを持っています: Client has_many products と Product belongs_to client です。クライアント ショー ビューでは、現在のクライアントに自動的に属する新しい製品を作成するためのフォームを提示します。クライアント コントローラの show メソッド

def show
  @client    = Client.find(params[:id])
  @products  = @client.products.paginate(page: params[:page])
  @product = @client.products.new
  @product.client_id = @client.id
end

ショービューは部分的にレンダリングします

    <h1>New Product:</h1>
    <%= render 'shared/product_form' %>

それは機能し、製品は正しく作成されます。

検証エラーが発生した場合、製品の create メソッドにフラッシュを設定し、redirect_to をクライアントの表示ページに設定します。そこで、正しく入力されたデータを失います。@product インスタンス変数を保存しようとしましたが、これにはすべてのデータ (間違ったフィールドを含む) が含まれています。

render client_path(client) 

製品コントローラから、しかしそれはエラーを生成します

テンプレート /clients/17 がありません

アドレスは

http://localhost:3000/products

私はこれを間違って呼んでいますか?render は通常、同じコントローラーのアクションをレンダリングすることを知っています。どうにかして製品コントローラーから Client::show をレンダリングできますか? ユーザーが入力したデータを保存する別の方法はありますか?

4

3 に答える 3

0

アンドリューの素晴らしい答えに加えて
、モデルの検証が失敗した場合にRailsでコメントコントローラーをレンダリングする場所は?
解決策をより明確にします。

createあなたの具体的な例: のアクションには、ProductsController必要なすべてのインスタンス変数があることに注意してくださいrender 'clients/show'

于 2014-01-24T14:46:56.423 に答える
0

はい、あなたはそれを間違って呼んでいました。

次の 3 つの問題があります。

  1. renderclient/newなどのテンプレート名をレンダリングする必要がありますshared/form。引数はパスまたは変数にすることはできません。変数はコントローラーによってビューに渡され、render.

  2. render保存失敗には使用しないでください。products/create#1 で述べたようにテンプレート名を使用しても、クライアント ページのように間違った URL になってしまいます。それは受け入れられません。

    私の提案は、常にredirect失敗の保存に使用することです。

  3. マイナーな問題。コントローラーで を使用@product = @client.products.newした場合、@productオブジェクトのすべての属性が空になりますが、有効なクライアント ID が含まれます。したがって、クライアント ID を再度割り当てる必要はありません@product.client_id = @client.id。しかし、これは結果を損なうものではありません。

于 2013-04-21T16:35:14.943 に答える