Ruby on rails 导轨-通过重复动作对干燥进行响应
在我的一个rails控制器中,我必须响应几种类型的格式,因此我使用典型的Ruby on rails 导轨-通过重复动作对干燥进行响应,ruby-on-rails,controller,dry,Ruby On Rails,Controller,Dry,在我的一个rails控制器中,我必须响应几种类型的格式,因此我使用典型的respond\u to链: respond_to do |format| format.html { ... } format.mobile { ... } format.jpg { ... } format.xml { ... } format.js { ... } end 通常,{…}部分以多种格式重复。在这个箱子上保持干燥的最好方法是什么?在html、mobile和xml具有“重复”
respond\u to
链:
respond_to do |format|
format.html { ... }
format.mobile { ... }
format.jpg { ... }
format.xml { ... }
format.js { ... }
end
通常,{…}
部分以多种格式重复。在这个箱子上保持干燥的最好方法是什么?在html
、mobile
和xml
具有“重复”操作的场景中,我想做如下操作:
respond_to do |format|
format[:html, :mobile, :xml] { ... }
format.jpg { ... }
format.js { ... }
end
respond_to do |do|
format.html { common_stuff }
format.mobile { common_stuff }
format.xml { common_stuff }
...
end
protected
def common_stuff
...
end
非常感谢。你能举一个你看到的重复的例子吗 你可以一直这样做:
respond_to do |format|
format[:html, :mobile, :xml] { ... }
format.jpg { ... }
format.js { ... }
end
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 }) }
话虽如此,我认为您最好使用前者,因为前者更明确。您尝试过format.any(:html,:mobile,:xml)吗
示例(2011/9/14增补)
从
Respond to(响应)还允许您使用以下任一选项为不同格式指定公共块:
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
作为补充说明,我浏览了respond_to api()。上面写着respond_to takes parameters,还有一个block。也许解决方案就在那里?我最终使用了一个公共函数。它看起来比lambda的东西更简单。谢谢分享。我最近有机会再次攻击这个问题。这个解决方案很有效!所以它现在是最好的答案。更新(对不起,jonnii)很高兴知道我的回答很有用!回头见