2017-08-08 41 views
0

在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) 

回答

0

爲什麼不改變你的js部分的js.erb部分和嵌入你希望它被解析成標準的JS,而不是通過頭髮送之前發送的消息?

以同樣的方式

你可以有.html.erb文件,你也可以有.js.erb文件:

# create.js.erb 
<% if flash[:notice] %> 
$('.flash-container').html('<p><%= flash[:notice] %></p>'); 
<% end %> 

在保持其維護和乾燥而言,這只是下到代碼的設計,創建一個共享js.erb局部您呈現其他.js.erb parials內:

# some_controller.rb 
helper_method :handle_ajax_messages 

# create.js.erb 
$('.flash-container').html('<p><%= handle_ajax_messages %></p>'); 

#shared/_ajax_messages.js.erb 
<% if flash[:notice] %> 
$('.flash-container').html('<p><%= flash[:notice] %></p>'); 
<% end %> 
<% if flash[:error] %> 
$('.flash-container').html('<p><%= flash[:error] %></p>'); 
<% end %> 

# create.js.erb 
<%= render(partial: 'ajax_messages') %> 

在頂級控制器創建共享是helper_method

你可以提取一個ServiceObject處理程序,或者如果你的工廠是DDD來創建自定義的NoticeObjects或值對象和#to_html#to_js#to_json等方法來保持對所有類型的請求DRY。如果你打破了一些所謂的「Rails約定」,有很多其他選項和方法可以保持代碼的乾爽和可維護性。

+0

感謝這個廣泛的答案。你的第一個建議仍然需要'ajax_messages'手動插入每個JS部分。但是,如果我希望「ajaxified消息」成爲當前存在的或將來可能添加的任何操作的默認值,那麼標題是否是最佳方式?如果是這樣,爲什麼我會得到這個奇怪的'該頁面不存在!'第一次發送請求? –

+0

DDD可能是我在找的東西。你能否提出任何基本的rails示例/教程,以幫助我更好地瞭解如何實現這種方法? –

+0

確實第一部分只是解釋一下,你可以使用嵌入式ruby和js文件,然後打開它們到你的整個ruby代碼庫,允許你以任何你想要的方式幹掉它。林不知道爲什麼你得到的頁面不存在的錯誤,並在頭部方面,雖然它可能是一種可行的方法,我不會親自使用它。 DDD,但我強烈建議,因爲它允許您創建DRY可重複使用的代碼,以便在幾乎任何情況下都可以很容易地進行調整和重用,正如我在上面提到的那樣,我會創建可翻譯的值對象。鏈接: –