自动将参数附加到*_url或*_path方法(Rails)

Mat*_*ins 2 parameters url ruby-on-rails path

我有一组与我的控制器有关的特定视图,我想要任何调用*_path*_url附加一组参数.

是否有一些我可以覆盖的魔术方法让我这样做?我不知道在Rails代码中甚至处理的方法*_path*_url方法.

编辑为清晰起见:我正在寻找一种方法来做到这一点,这样我就不必修改每个需要发生的视图中的每个链接.我不希望每个触及这组视图的编码器都必须记住在他们添加到页面的每个链接上附加一个参数.应自动附加相同的参数.我认为改变*_url*_path称为失败.类似地,必须覆盖每个*_url*_path调用被认为是失败的,因为每当添加/删除新链接时都必须添加/删除新方法.

Sam*_*uel 7

您可以通过覆盖来执行此操作,url_for因为所有路由方法都会调用它.

module ApplicationHelper
  def url_for(options = {})
    options.reverse_merge!(@extra_url_for_options) if @extra_url_for_options
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是使用a before_filter来设置@extra_url_for_options哈希来强制所有网址.

class MyController < ApplicationController
  before_filter do { @extra_url_for_options = { :format => 'html' } }
end
Run Code Online (Sandbox Code Playgroud)

请注意,这将强制所有链接使用额外选项.


Mat*_*ins 7

感谢Samuel的回答,我能够通过一个新助手创建一个最终的工作解决方案,我已经在下面提到了.

module ExampleHelper
  def url_for(options={})
    options = case options
    when String
      uri = Addressable::URI.new
      uri.query_values = @hash_of_additional_params

      options + (options.index('?').nil? ? '?' : '&') + uri.query
    when Hash
      options.reverse_merge(@hash_of_additional_params)
    else
      options
    end

    super
  end
end
Run Code Online (Sandbox Code Playgroud)