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

时间:2010-11-18 16:08:46

标签: ruby-on-rails url parameters path

我有一组与我的某个控制器相关的特定视图,我希望对*_path*_url的任何调用都附加一组参数。

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

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

4 个答案:

答案 0 :(得分:7)

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

module ApplicationHelper
  def url_for(options = {})
    options.reverse_merge!(@extra_url_for_options) if @extra_url_for_options
    super
  end
end

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

class MyController < ApplicationController
  before_filter do { @extra_url_for_options = { :format => 'html' } }
end

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

答案 1 :(得分:7)

感谢Samuel's answer,我能够通过新助手创建最终的工作解决方案,我已将其包含在下面。

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

答案 2 :(得分:1)

您可以尝试使用with_options方法。在您的视图中,您可以执行类似

的操作
<% with_options :my_param => "my_value" do |append| -%>

  <%= append.users_path(1) %>

<% end %>

假设您当然有users_path。 my_param = value 将附加到网址

答案 3 :(得分:0)

你可以制作一个辅助方法:

def my_path(p)
  "#{p}_path all the parameters I want to append"
end

并在视图中使用

<%= eval(my_path(whatever)) %>

Eval为您提供动态范围,因此您的视图中可用的每个变量都可以在帮助程序中使用。如果您的参数是常量,您可以摆脱eval调用。