我想了一个名为same_url方法? 如果URL中传递都是平等的,将返回true。 该URL中传递可能是要么PARAMS选项哈希或字符串。
same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true
Rails框架帮手CURRENT_PAGE? 似乎是一个很好的起点,但我想在URL中任意数量的通过。
作为额外的奖励这将是很好的,如果PARAMS的哈希排除从比较中可以传递这样一个方法调用可能看起来像:
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
如果你是on Rails的预2.0.1,您还需要添加except
辅助方法哈希:
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
已经(来源: 布莱恩·格思里 )
这是诸如此类的事情,你后?
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参数散列的阵列(每个阵列条目是PARAMS来构建URL) -
exclude_keys
是符号的钥匙数组要忽略 -
request.request_uri
可能不正是你应该用什么,见下文。
再就是你要实现你的版本时,需要考虑各种事情:
- 你想比较完整的URI与域,端口和一切,或者只是路径?
- 如果人的路,做自己想做的还是比较问号后面传递的参数或只是那些组成的实际路径路径?
文章来源: What is the best way in Rails to determine if two (or more) given URLs (as strings or hash options) are equal?