在我的一个rails控制器中,我必须回复几种类型的格式,因此我使用典型的respond_to
链:
respond_to do |format|
format.html { ... }
format.mobile { ... }
format.jpg { ... }
format.xml { ... }
format.js { ... }
end
通常{ ... }
部分会以多种格式重复出现。在这种情况下保持DRY的最佳方法是什么?在html
,mobile
和xml
有“重复”操作的情况下,我想做类似的事情:
respond_to do |format|
format[:html, :mobile, :xml] { ... }
format.jpg { ... }
format.js { ... }
end
非常感谢。
答案 0 :(得分:20)
您是否尝试过format.any(:html,:mobile,:xml)?
示例(已添加2011/9/14)
响应还允许您使用任何:
为不同格式指定公共块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
答案 1 :(得分: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 }) }
话虽如此,我认为你对前者更好,因为它更明确。