7

我想要一个名为 same_url 的方法?如果传入的 URL 相等,则返回 true。传入的 URL 可能是参数选项哈希或字符串。

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 
4

3 回答 3

5

这是方法(将其放入 /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 pre-2.0.1 上,您还需要将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

于 2008-09-24T12:25:41.400 回答
1

这是你追求的那种东西吗?

def same_url?(one, two)
  url_for(one) == url_for(two)
end
于 2008-09-24T11:55:31.083 回答
0
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 与域、端口和所有,还是只是路径?
  • 如果只是路径,您是否仍要比较在问号之后传递的参数还是仅比较构成实际路径路径的参数?
于 2009-03-15T23:48:21.753 回答