在ajax請求之後,向用戶顯示消息的最佳方式(即最可維護,乾燥)是什麼?如何爲ajax請求編寫DRY Flash消息?
顯然,爲單個JS控制器操作實現此目的的最簡單方法是簡單地使用關聯的JS部分。例如,
#create.js
$('.flash-container').html('<p>SUCCESS!</p>');
但是,如果應用程序中包含大量ajaxed動作,這很快變得難以維護,需要許多諧音進行更新,如果需要作出改變。
我目前使用的方法如下。但是這總是顯得非常脆弱和'哈克' - 我必須忽視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消息」成爲當前存在的或將來可能添加的任何操作的默認值,那麼標題是否是最佳方式?如果是這樣,爲什麼我會得到這個奇怪的'該頁面不存在!'第一次發送請求? –
DDD可能是我在找的東西。你能否提出任何基本的rails示例/教程,以幫助我更好地瞭解如何實現這種方法? –
確實第一部分只是解釋一下,你可以使用嵌入式ruby和js文件,然後打開它們到你的整個ruby代碼庫,允許你以任何你想要的方式幹掉它。林不知道爲什麼你得到的頁面不存在的錯誤,並在頭部方面,雖然它可能是一種可行的方法,我不會親自使用它。 DDD,但我強烈建議,因爲它允許您創建DRY可重複使用的代碼,以便在幾乎任何情況下都可以很容易地進行調整和重用,正如我在上面提到的那樣,我會創建可翻譯的值對象。鏈接: –