Как лучше всего в Rails определить, равны ли два (или более) заданных URL-адреса (в виде строк или параметров хеширования)? - PullRequest
7 голосов
/ 24 сентября 2008

Я хочу метод с именем same_url? это вернет true, если переданные URL-адреса равны. Переданные URL-адреса могут быть хэшем параметров params или строками.

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

Помощник Rails Framework current_page? кажется хорошей отправной точкой, но я бы хотел передать произвольное количество URL.

В качестве дополнительного бонуса. Было бы хорошо, если бы можно было передать хэш параметров, исключаемых из сравнения. Поэтому вызов метода может выглядеть следующим образом:

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

Ответы [ 3 ]

5 голосов
/ 24 сентября 2008

Вот метод (закинуть его в / 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.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 (кредит: Брайан Гатри )

1 голос
/ 24 сентября 2008

Это то, что вам нужно?

def same_url?(one, two)
  url_for(one) == url_for(two)
end
0 голосов
/ 16 марта 2009
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 с доменом, портом и всеми, или только путь?
  • Если это просто путь, хотите ли вы сравнить аргументы, переданные после знака вопроса, или только те, которые составляют фактический путь?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...