2

基本的に、ユーザーがサインインしているかどうかに関係なく機能する必要がある「新しいリスト」フォームに取り組んでいます。したがって、ユーザーがサインインしていない場合は、ユーザーを作成してサインインし、関連するリスト。私はdeviseでRails 4を使用していますが、Webアプリではかなり一般的であるように見えるため、このシナリオのベストプラクティスが何であるかを知る必要があります.

そのため、リスト フォームの下部にある fields_for :user タグ内に主要なユーザー フィールド (電子メール、パス、パス確認) があり、ユーザーがログインしていない場合にのみ表示されます。リスト フォーム内にあるので、フィールド名は、listing[user][email] などの形式になっています。現在、'listings' コントローラー内の作成関数は次のようになっています。

def create

#if not logged in, create user & sign them in
if !user_signed_in?
  @user = User.new(params[:listing].require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation))
  if @user.save
    sign_in @user
  else
    @listing.errors.add :base, "Invalid user data"
  end
end

 @listing = current_user.listings.build(listing_params)  
 if @listing.save
   redirect_to listing_url(@listing), notice: 'Success! Now, add some images'
 else
   render "new"
 end  
end

検証エラーがない限り、これはすべて正常に機能します。@listing.errors.add 行の後に render "new" を追加できると思っていましたが、これは機能していないようです (まだ "@listing = current_user.listings.build(listing_params)" 行でエラーが発生します)。ユーザーはまだ作成/サインインされていません。すべてのユーザー フィールドを入力すると、ユーザーが正常に作成されてサインインされるため、通常のリスト検証エラーが正しく表示されます。

とにかく、私はこれで正しい方向に進んでいるかどうかについて少し迷っています-誰かがこのプロセスを「レールのように」機能させる方法に光を当てることができますか? 助けてくれてありがとう!

4

1 に答える 1

0

あなたはほとんどそこにいます。あなたの質問では、行を追加しrender "new"ても役に立たないと言いました。それは、その行の後に関数の残りの部分を実行し続けているからです。あなたがしたいことはすぐに終了することなので、ラインにぶつかっていません@listing = current_user.listings.build(...)

ユーザーが無効であることがわかるとすぐにアクションを終了するように、 render "new" and returnafterが必要です。@listing.errors.add :base, ...

于 2013-09-01T21:26:07.207 に答える