什么是Rails的最好的办法,以确定是否两个(或更多)给出的网址(如字符串或哈希选项)相等?(Wha

2019-09-23 03:23发布

我想了一个名为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 

Answer 1:

这里的方法(塞子在/ 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已经(来源: 布莱恩·格思里 )



Answer 2:

这是诸如此类的事情,你后?

def same_url?(one, two)
  url_for(one) == url_for(two)
end


Answer 3:

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?