ajaxリクエスト後にユーザーにメッセージを表示するには、どのような方法(つまり、最も管理しやすい、DRY)が最適ですか?ajaxリクエストのDRYフラッシュメッセージを書き込む方法は?
明らかに、単一のJSコントローラアクションでこれを実現する最も簡単な方法は、関連するJS部分を使用することです。アプリはajaxedアクションが多数含まれている場合、例えば、
#create.js
$('.flash-container').html('<p>SUCCESS!</p>');
はしかし、これはすぐに変更が必要な場合は、更新する多くのパーシャルを必要とし、unmaintainableになります。
私が現在使っているアプローチは以下の通りです。しかし、これはいつも非常に脆く、「ハッキリ」と思われます。私はRailsのコンベンションを見落とさなければなりませんか?
これは、最初にAjaxリクエストがページでトリガーされたときにThat page doesn't exist!
を返します。すべての後続の要求は、ページがリロードされるまで、予期される結果を返します。何が起こっている?
#my_controller.rb
def create
if @object.save
format.js { flash[:notice] = t('.notice') }
else
format.js { flash[:error] = t('.error') }
end
end
# application_controller.rb
after_action :flash_to_headers
def flash_to_headers
return unless request.xhr?
response.headers['X-Message'] = flash_message
response.headers["X-Message-Type"] = flash_type.to_s
flash.discard
end
def flash_message
[:alert, :error, :notice, :success].each do |type|
return flash[type] unless flash[type].blank?
end
return nil
end
def flash_type
[:alert, :error, :notice, :success].each do |type|
return type unless flash[type].blank?
end
return :empty
end
#flash.js.coffee
$(document).ajaxComplete (event, request) ->
msg = request.getResponseHeader("X-Message")
type = request.getResponseHeader("X-Message-Type")
if msg
alert(msg)
この広範な回答をいただきありがとうございます。あなたの最初の提案は 'ajax_messages'をすべてのJS部分に手動で挿入する必要があります。しかし、「ajaxified messages」を、現在存在している、または将来追加される可能性のあるアクションのデフォルトにしたい場合、ヘッダーは最善の方法ですか?もしそうなら、なぜ私はこの奇妙な「そのページは存在しない!」という要求を最初に送信したのですか? –
DDDが私が探しているものかもしれません。どのようにこのアプローチを実装するかをよりよく視覚化するのに役立つ基本的なレールの例/チュートリアルをお勧めしますか? –
確かに、最初のセクションでは、jsファイルに埋め込みルビを使うことができ、あなたの望むどのような方法でもあなたのためにあなたの全体のルビコードベースを開くことができます。なぜあなたはページが存在しないのかわからないのですが、ヘッダーの面では実行可能なアプローチかもしれませんが、個人的には使用しません。ただし、DRY再利用可能なコードを簡単に作成できるので、DDDをお勧めします。これは、上記のように、翻訳可能なバリューオブジェクトを作成するように、ほとんどすべてのケースで簡単に適応でき、再利用できます。リンク: –