【问题标题】:Automatically append parameters to *_url or *_path methods (Rails)自动将参数附加到 *_url 或 *_path 方法(Rails)
【发布时间】:2011-05-12 03:23:48
【问题描述】:

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

是否有一些我可以覆盖的神奇方法可以让我做到这一点?我不知道在 Rails 代码中的哪个位置处理了 *_path*_url 方法。

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

【问题讨论】:

  • 您这样做是为了解决什么问题?
  • 在 Facebook 画布页面上,所有“fb_*”参数必须附加到应用程序中出现的所有链接,以便可以通过其 API 访问与登录用户相关的 Facebook 数据。

标签: ruby-on-rails url parameters path


【解决方案1】:

您可以通过覆盖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

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

【讨论】:

  • 啊,这就是我要找的。我知道在某个地方一定有一种神奇的方法,但我不知道它是什么。我假设我可以用 ControllerSpecificHelper 而不是 ApplicationHelper 做同样的事情,对吗?
  • 嗯,当我调用*_path*_url 时,看起来options 不是一个哈希值,而是一个字符串,这意味着我不能调用reverse_merge!。我想我可以将参数附加到该字符串并以这种方式调用 super,这看起来对吗?
  • 感谢您的帮助,您为我找到了正确的解决方案:stackoverflow.com/questions/4216906/…
【解决方案2】:

感谢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

【讨论】:

    【解决方案3】:

    您可以尝试使用with_options 方法。在您看来,您可以执行类似的操作

    <% with_options :my_param => "my_value" do |append| -%>
    
      <%= append.users_path(1) %>
    
    <% end %>
    

    当然,假设您有 users_path。 my_param=value 将附加到 url

    【讨论】:

      【解决方案4】:

      你可以创建一个辅助方法:

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

      并在视图中使用

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

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

      【讨论】:

      • 但是我将不得不编写大约 20 个方法,页面中每个方法一个,并在每次引用新 URL 时手动更新帮助程序。我正在寻找可以在一个地方完成的事情,并让它影响页面上的每个*_url/*_path 调用。
      • 您只需在任何地方使用 eval(my_path('whatever')) 而不是whatever_path - 帮助程序将参数作为路径名称,无需编写多个方法。如果我没听懂,请解释一下。
      • 我想我看不到 eval(my_path(whatever))my_path(whatever, extra_whatever) 更好...我正在寻找一种方法,不必编辑每个视图中的每个链接,这样如果其他人出现并在我们的代码库中添加到视图的链接,他们不需要记住将其包装在 eval() 中,手动附加额外的参数,或者做任何其他特殊的事情。
      • extra_whatever 可能是一个大哈希, eval(my_path(whatever)) 不需要复制任何代码 - 如果您想更新参数,您只需要一次完成地点。
      • 这将需要在非常糟糕的视图中定义 extra_whatever (好吧 eval 也非常糟糕)。无论如何,其他答案似乎是解决这个问题的一种很酷的方法。
      猜你喜欢
      • 2014-09-05
      • 1970-01-01
      • 2012-08-10
      • 2012-10-27
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多