【问题标题】:RoR - Two respond_to formats using same block?RoR - 使用同一块的两种响应格式?
【发布时间】:2015-04-08 09:19:43
【问题描述】:

有没有类似的东西:

respond_to do |format|

  format.html || format.xml do
    #big chunk of code
  end

end

为了 DRY,我愿意这样做。

【问题讨论】:

  • 那么您希望块返回什么格式 - html 或 xml?您可以将所有逻辑放在 respond_to 之外,然后只在最后将其格式化为 html/xml - 这有帮助吗?
  • 使用 format.any(:html, :xml) {...} 查看 stackoverflow.com/a/2430682/265940 以获得更好的答案

标签: ruby-on-rails


【解决方案1】:

Respond_to 实际上允许您使用 any 为不同格式指定通用块:

format.any(:js, :json) { #your_block }

【讨论】:

  • 其实我认为这是唯一真正有用的答案。我无法得到运行的“Proc”答案并且这个肯定更短更干净。谢了!
  • 另外,format.allformat.any 的同义词,如果这对您更有意义的话。
【解决方案2】:

你可以使用这样的格式:

class PeopleController < ApplicationController
  respond_to :html, :xml, :js

  def index
    @people = Person.find(:all)
    respond_with(@people) do |format|
        format.html
        format.xml
        format.js { @people.custom_code_here }
    end
  end
end

如果您遇到更复杂的情况,请告诉我,这将实现您的目标。请参阅此article on the respond_with 方法以获取更多帮助。

【讨论】:

  • 原谅我到现在才回答,问题是:我想 format.html 和 format.xml 共享相同的代码,但我也有 format.js ,我不想要它可以访问 format.html 或 format.xml 的代码(在这种情况下是相同的)。
  • 使用上面代码的修改版本。如果您有任何问题,请告诉我。
【解决方案3】:

当你

respond_to do |format|
  format.html do
    #block
  end
  format.xml do
    #block
  end
end

或者你

respond_to do |format|
  format.html { #block }
  format.xml { #block }
end

您正在利用 ruby blocks,它被评估为 Procs。因此你可以这样做

respond_to do |format|
  bcoc = Proc.new do
    # your big chunk of code here
  end
  format.html bcoc
  format.xml bcoc
end

但也许您可以将其中的一些逻辑移到您的数据结构中?

【讨论】:

  • Ty Alex,我会采用这个解决方案,因为我可以限制 format.js 访问 format.html/xml 的代码。
  • Ruby 块不是 Procs。它们可以来回转换,但它们不是一回事。
  • @MatthewRatzloff 我的理解是块语法就是这样:定义闭包的最常见的 ruby​​ 语法。见https://gist.github.com/3757938。那它们是什么?很高兴得到纠正。
  • @AlexanderWenzowski 那里有很多错误信息。与号一元运算符将块转换为 Proc,这就是它报告自己为 Proc 的原因。块与 Procs 不同,但可以轻松地来回转换。 Procs实际上是从块创建的;块只是一个轻量级的结构。差异很小,但它们有不同的名称是有原因的。 :-)(另见loudthinking.org/2009/10/block-vs-lambda-vs-proc.htmlruby-doc.org/core-1.9.3/Proc.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多