Rails确定两个(或更多)给定URL(作为字符串或哈希选项)是否相等的最佳方法是什么?

我想要一个名为same_url的方法? 如果传入的URL相等,则返回true。 传入的URL可能是params选项hash或strings。

same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true 

Rails框架帮助器current_page? 似乎是一个很好的起点,但我想传递任意数量的URL。

作为额外的奖励如果可以传入从比较中排除的参数的散列,那将是很好的。所以方法调用可能看起来像:

 same_url?(projects_path(:page => 2), "projects?page=3", :excluding => :page) # => true 

这是方法(在/ lib中将其打包并在environment.rb中需要它):

 def same_page?(a, b, params_to_exclude = {}) if a.respond_to?(:except) && b.respond_to?(:except) url_for(a.except(params_to_exclude)) == url_for(b.except(params_to_exclude)) else url_for(a) == url_for(b) end end 

如果您使用的是Rails 2.0之前的版本 ,则还需要将except辅助方法添加到Hash:

 class Hash # Usage { :a => 1, :b => 2, :c => 3}.except(:a) -> { :b => 2, :c => 3} def except(*keys) self.reject { |k,v| keys.include? k.to_sym } end end 

Rails的后续版本(好的,ActiveSupport)包括已经except (信用: Brian Guthrie )

这是你想要的那种东西吗?

 def same_url?(one, two) url_for(one) == url_for(two) end 
 def all_urls_same_as_current? *params_for_urls params_for_urls.map do |a_url_hash| url_for a_url_hash.except(*exclude_keys) end.all? do |a_url_str| a_url_str == request.request_uri end end 

其中:

  • params_for_urls是一个url参数哈希数组(每个数组项都是用于构建url的参数)
  • exclude_keys是要忽略的键的符号数组
  • request.request_uri可能不是您应该使用的,请参阅下文。

然后,在实施您的版本时,您需要考虑各种各样的事情:

  • 你想比较完整的uri与域名,端口和所有,或只是路径?
  • 如果只是路径,你还想比较问号之后传递的参数或者只是构成实际路径路径的参数吗?