2

私は既存のRails3.2アプリケーションをAJAX化していますが、クライアントから行われるリクエストの一部は非同期で実行する方が適切です。これを容易にし、レンダリング時間を短縮するために、アラートを介してユーザーにフィードバックを提供しています。application.html.erbファイルに空白のdivがあり、次のような特定のコントローラーアクションから必要に応じてアラートを追加します。

def my_async_controller_action
  @user = User.find(params[:id])
  begin
    #@user.import
    flash[:notice] = "Your data is being downloaded."
  rescue Exception => bang
    flash[:alert] = "There was an error downloading your data: #{bang.message}"
  end

  respond_to do |format|
    format.js { render 'common/flashes' }
  end
end

そして、私のcommon/flashesファイルは、jQueryを使用appendして空白のdivへのアラートを送信します。正常に動作しますが、リダイレクトを介してのみ、このようにアラートが配信されるのを見たことがありません。このアプローチを取ることによって私が破っている、書かれていない(または書かれた)Railsの規則または規則はありますか?また、代わりにこれをrespond_withとして実行する方法はありますか?1行から2種類のレンダリングを行う方法がわかりません。

4

2 に答える 2

4
  1. レンダリングしているファイルの名前がコントローラーのアクションと同じである場合、ブロックjsは必要ありません。respond_to

    ただし、jsファイルを共通フォルダーに配置しているため、コントローラー間で再利用するには、そのファイルをレンダリングするようにRailsに明示的に指示する必要があります。これはまったく問題ありません。

  2. アクションがにのみ応答する場合jsは、ブロックの代わりに角かっこを使用do ... endして、ワンライナーにすることができます。

    respond_to { |format| format.js }
    

    ただし、jsファイルの名前を指定する必要があるため、これは非常に見苦しくなる可能性があります。そのため、respond_toブロックを省略して、次の手順を実行するだけです。

    render 'common/flashes'
    

    ただし、これには、コントローラーが要求を受信した場合に、共通フォルダー内のhtml名前のファイルを検索するという不便があります。flashes.htmlこれにより、エラーが返される可能性がありTemplate is missingます。これを修正したい場合は、フォーマットにいくつかの制約を追加する必要があります。

  3. ただし、アクションがにも応答するhtml場合は、次のようにブロックを宣言する必要があります。

    respond_to do |format|
      format.html
      format.js { render 'common/flashes' }
    end
    

    は必要ありませんがformat.html、コードを見ると、htmljsリクエストの両方に応答していることがすぐにわかります。

  4. 一部のJavaScriptのみをレンダリングしているため、respond_withブロックを使用してさまざまなファイルをレンダリングすることは、この場合には適用できません。さまざまな形式(html、json、xml)でリソースrespond_withを返すために使用されます。この記事ではもう少し詳しく説明します。

于 2013-02-19T11:17:15.487 に答える
2
respond_to do |format|
    format.js 
end

コントローラ側からは問題ありません。

.js.erbでレンダリングするときは、必ずescape_javascriptを使用してください

于 2013-02-15T04:00:10.253 に答える