2010-02-03 50 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