0

と の 2 つのモデルがUserありWantます。A User has_many: Wants.

Wantモデルには 以外user_idに 1 つのプロパティがありますname

editアクション ビューにUsersControllerは 2 つのフォームがあります。UsersController1 つはupdate メソッドにPOST (PUT) してユーザーを更新し、もう 1 つはアクションに POST してユーザーのアカウントにWantsController create新しいものを追加します。Want

これは問題なく、動作していますが...

createアクションで、のアクションWantsControllerにリダイレクトして、成功または検証エラーを表示します。editUsersControllerWant

問題は、編集アクションがフォームの新しい @want を作成し、検証エラーが要求で失われることです。

createでアクションを確認してくださいUsersController:

def create
    @want = current_user.wants.build(params[:want])
    if @want.save
      flash[:success] = "WANT created!"
      redirect_to user_account_path current_user.username
    else
      #flash[:validation] = @want.errors <- I NEED THESE ERRORS FOR MY VIEW
      redirect_to user_account_path current_user.username
    end
  end

および の edit アクションUsersController:

def edit
  @want = @user.wants.build
  super
end

リダイレクトにより、インスタンス変数WantsControllerのエラーが失われます。@want(コメントに示されているように)にエラーを保存できますflashが、確かにこれは の完全な誤用ですflash

私の質問は、アクション全体でこれらのエラーを永続化して、ビューでWant検証エラーをレンダリングできるようにするにはどうすればよいですか?

また、これはRails規約の検証とみなされますか? ユーザーが 1 つの文字列プロパティで 1 つの want を追加できるように、まったく新しいページを作成するのは少しやり過ぎのようです!

ありがとう。

4

1 に答える 1

0

リダイレクトするよりも、このような状況でレンダリングする方が一般的です:

if @want.save
  …
else
  @user = current_user
  render 'users/edit', status: 400
end

ただし、これにはいくつかの欠点があります。

  • users/editテンプレートが変更され、追加のインスタンス変数が必要になった場合は、2 つのコントローラー アクションを変更する必要があります。ビューをレンダリングするために必要なすべてを含むプレゼンター オブジェクトを使用することで、これを回避できusers/editます。
  • ページで多くのことが行われているusers/edit場合、ユーザーが修正しようとしているエラーを見つけるのが難しい場合があります。この場合wants/new、新しい欲求を作成するためのフォームを表示するだけのビューを追加すると、問題が簡素化されると私は主張します。との間wants/newでいつでもフォーム コードを共有できますusers/edit
于 2013-06-27T11:25:27.877 に答える