【问题标题】:"patch" rails render function to edit default options“patch”rails 渲染函数来编辑默认选项
【发布时间】:2009-07-28 14:07:12
【问题描述】:

当我在 rails 中渲染 :xml 时,我总是想要 :dasherize => false 选项。有没有办法将它设置为应用程序范围的默认值,而无需修改 Rails 源代码?

可能是一个渲染函数,它以某种方式优先于第一个,然后使用此选项调用它...

【问题讨论】:

  • 希望它不应该破坏应用程序中使用渲染功能的任何其他部分......它应该只有在被控制器调用时才能以这种方式工作(我认为这是它被调用的唯一地方无论如何..)

标签: ruby-on-rails ruby


【解决方案1】:

这样做确实有不利的一面,即当其他人查看您的代码时,可能会导致意外行为(即,直到他们发现您的重写方法之前,他们可能想知道为什么它的行为像 dasherize false明确指定。)也就是说,在 ApplicationController 或您的特定控制器之一中,您可以覆盖渲染方法。

例如类似:

class MyController < ApplicationController
  def render(options = nil, extra_options = {}, &block)
    options ||= {} # initialise to empty hash if no options specified
    options = options.merge(:dasherize => false) if options[:xml]
    super(options, extra_options, &block)
  end
end

如果你想让 dasherize 在你的渲染调用中仍然可以被覆盖,你可以在另一个方向上进行哈希合并,例如

options = {:dasherize => false}.merge(options)

【讨论】:

  • 如果我使用指令渲染页面时遇到了问题:render 'show.xml.builder', :layout => false。选项然后是一个字符串而不是一个哈希。我进行了检查以确保它是一个哈希,但它似乎是一个 hack。还有其他建议吗?
  • if 条件变为if options.is_a? Hash and ooptions[:xml] 似乎是合理的,或者,您可以在ensure 中使用begin/ensure 块和super 调用。
【解决方案2】:

您也可以尝试这样的解决方案:

alias_method_chain :render, :no_dasherize

def render_with_no_dasherize(options = nil, extra_options = {}, &block)
  new_options = options
  new_options = {:dasherize=>false}.merge(options) if(options[:xml])
  render_without_no_dasherize(new_options, extra_options, &block)
end

您可以将它放在应用程序控制器中(因此所有控制器都会受到影响)或仅放在特定控制器中。

【讨论】:

  • 这是一个很好的做法,因为您可能想在某个时候访问被覆盖的函数;)
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
相关资源
最近更新 更多