3

私のRailsアプリの作成コントローラーのrespond_toブロックは、保存が成功してもリダイレクトされません...これは簡単な解決策だと確信していますが、Railsの経験がなく、この問題に遭遇したのはこれが初めてです.

:remote => true となるようにフォームを設定し、コントローラは次のように...

def create
    @store = current_user.stores.new(store_params)

    respond_to do |format|
        if @store.save
            format.html { redirect_to root_path }
        else
            format.html { flash[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" 
            render "new" }
            format.js {}
        end
    end
end

そして、私がこの件について話している間、条件のelse部分のコードも実行されません。ただし、例外はformat.js {}、私の create.js.erb ファイルのコードを実行します (当面はアラート)。

私はRails 4.2.5で作業しています。リダイレクトとアラートが機能しない理由を誰かが理解するのを手伝ってくれますか? ありがとうございました!

ソリューションを表示するための編集 リッチの回答に基づいて、私が思いついたソリューションは次のとおりです。

コントローラ:

def create
    @store = current_user.stores.new(store_params)

    flash.now[:alert] = "Save failed! #{@store.errors.full_messages.join(";")}" unless @store.save

    respond_to do |format|
        format.js
    end

    if @store.save
        flash[:notice] = "New store created"
    end
end

create.js.erb

<% if flash.now[:alert] %>
    $("#alert_holder").empty();
    $("#alert_holder").append("<%= j flash.now[:alert] %>");
<% else %>
    window.location.href = "<%= root_url %>";
<% end %>

リダイレクト URL を引用符で囲む必要があることに注意してください。

フォームが成功すると、ページはルートにリダイレクトされます。失敗すると、エラー メッセージが点滅しますが、フォームは更新されません。ユーザーが入力した回答はそのまま残ります。

4

2 に答える 2

2

フォームにある場合remote: true、コントローラーによって検出される形式は format.js になりますが、成功した@store.saveセクションにはありません。

2 つのオプション:

  • デフォルトで通常のフォーム送信 (を削除remote: true)
  • else 句と同じように追加して別の js.erb ファイルをロードformat.jsし、JavaScript を介してそこでエラー処理を行います。
于 2016-01-29T05:25:07.843 に答える