我有一组与我的某个控制器相关的特定视图,我希望对*_path
或*_url
的任何调用都附加一组参数。
是否有一些我可以覆盖的魔术方法让我这样做?我不知道Rails代码中的哪个方法甚至可以处理*_path
或*_url
方法。
为了清晰起见编辑:我正在寻找一种方法来实现这一点,这样我就不必修改每个需要发生这种情况的视图中的每个链接。我不希望每个触及这组视图的编码器都必须记住在他们添加到页面的每个链接上附加一个参数。应自动附加相同的参数。我认为对*_url
或*_path
的更改称为失败。同样,必须覆盖每个*_url
或*_path
调用都被视为失败,因为无论何时添加/删除新链接,都必须添加/删除新方法。
答案 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调用。