Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 导轨-通过重复动作对干燥进行响应_Ruby On Rails_Controller_Dry - Fatal编程技术网

Ruby on 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具有“重复”

在我的一个rails控制器中,我必须响应几种类型的格式,因此我使用典型的
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)很高兴知道我的回答很有用!回头见