基本的に、ユーザーがサインインしているかどうかに関係なく機能する必要がある「新しいリスト」フォームに取り組んでいます。したがって、ユーザーがサインインしていない場合は、ユーザーを作成してサインインし、関連するリスト。私は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)" 行でエラーが発生します)。ユーザーはまだ作成/サインインされていません。すべてのユーザー フィールドを入力すると、ユーザーが正常に作成されてサインインされるため、通常のリスト検証エラーが正しく表示されます。
とにかく、私はこれで正しい方向に進んでいるかどうかについて少し迷っています-誰かがこのプロセスを「レールのように」機能させる方法に光を当てることができますか? 助けてくれてありがとう!