2010-02-03 49 views
14

在我的rails控制器之一,我必須對幾種類型的格式進行迴應,所以我用的是典型的respond_to鏈:軌道 - 乾的respond_to反覆動作

respond_to do |format| 
    format.html { ... } 
    format.mobile { ... } 
    format.jpg { ... } 
    format.xml { ... } 
    format.js { ... } 
end 

通常的{ ... }部分重複幾個格式。在這種情況下保持DRY的最佳方式是什麼?在其中htmlmobilexml有「重複」操作的情況下,我想這樣做:

respond_to do |format| 
    format[:html, :mobile, :xml] { ... } 
    format.jpg { ... } 
    format.js { ... } 
end 

非常感謝。

+0

作爲一個方面說明,我瀏覽了respond_to代碼API(http://api.rubyonrails.org/classes/ActionController/MimeResponds/InstanceMethods.html)。它說respond_to需要參數,以及一個塊。也許解決方案在那裏? – kikito 2010-02-03 18:05:54

回答

19

你試過format.any。(:HTML,:手機,:XML)?

實施例(添加的2011年9月14日)

rails doc

響應,您還可以通過使用任何指定不同的格式公共塊:

def index 
    @people = Person.all 

    respond_to do |format| 
    format.html 
    format.any(:xml, :json) { render request.format.to_sym => @people } 
    end 
end 

在上面的例子中,如果格式是xml,它將會呈現:

render :xml => @people 

或者,如果格式是JSON:

render :json => @people 
+0

我最近有機會再次攻擊這個問題。這個解決方案有效所以現在是最好的答案。更新(抱歉jonnii) – kikito 2010-03-30 16:44:51

+0

很高興知道我的回答很有用!在這裏看到你 – raf 2010-03-31 01:35:33

+0

不錯,沒有離開format.any選項。 – 2012-11-20 23:03:26

5

你能舉一個你看到的重複的例子嗎?

你總是可以做這樣的事情:

respond_to do |do| 
    format.html { common_stuff } 
    format.mobile { common_stuff } 
    format.xml { common_stuff } 
    ... 
end 

protected 

def common_stuff 
    ... 
end 

我覺得這樣的事情會進行重構,以(我可能得到這個錯了,因爲我總是忘了如何使用方法塊:

[:html, :mobile, :xml].each { |f| format.send(:f, lambda{ common_stuff }) } 

話雖如此,我認爲你是前者更好,因爲它是更加明確

+0

我結束了使用一個共同的功能。它看起來比lambda更簡單。感謝分享這個。 – kikito 2010-02-05 08:35:30