1

現在、users#createアクションを使用している2つのビューがあります:users/new.thml.erbenter_email.html.erb

問題は、現在のコードではnew.html.erb、のフォームにenter_email.html.erb検証エラーがある場合にユーザーがリダイレクトされることです。だから私はこれを試しました:

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      if params[:action] == "enter_email"
        render 'enter_email'
      else
        render 'new'
      end
    end
  end

enter_email.html.erbアクションが「enter_email」のときにユーザーがリダイレクトされるようにしたかったのです。しかし、私はまだ「new.html.erb」にリダイレクトされています。

これを修正するための提案はありますか?(実行されているアクションが実際に行われているためcreateですか?その場合、リダイレクトを機能させるためにコードを変更するにはどうすればよいですか?)

4

2 に答える 2

3

私はそれを行うためのいくつかの方法を見ます:

  • 両方のフォームに非表示のフィールドを追加し、paramsそのフィールドの値をチェックインして、どちらのフォームから来たのかを確認します

    # in your new.html.erb view
    hidden_field_tag 'form_name', 'new'
    
    # in your enter_email.html.erb view
    

      hidden_​​field_tag'form_name'、'enter_email'

    # in controller
    if params[:form_name] == "enter_email"
      render 'enter_email'
    else
      render 'new'
    end
    
  • のような別のアクションを作成に使用しcreate_from_enter_emailenter_emailフォームをそれに向けます。

于 2012-11-06T10:04:53.680 に答える
2

ご想像のとおり、問題はアクションがcreateand notenter_emailであるため、if/else 条件は常に else ブランチに移動し、newビューがレンダリングされます。

前のビューをレンダリングするには、この回答request.referrerで提案されているように使用できます:

def create
  @user = User.new(params[:user])
  if @user.save
    sign_in @user
    flash[:success] = "Welcome to the Sample App!"
    redirect_to @user
  else
    if request.referrer == root_url
      render 'enter_email'
    else
      render 'new'
    end
  end
end

ログイン部分がホームページにあるという事実に基づいているかどうかを確認しています(以下のコメントで言及していますrequest.referrer)。root_urlこれはうまくいくはずです。

于 2012-11-06T09:27:40.033 に答える