2008-09-24 3 views
7

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

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

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

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

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

Я замечаю, что в вашем примере у вас есть строковый url, но вы все еще ожидаете, что параметр страницы будет исключен. Я бы разобрал это в хэш, используя модуль маршрутизации, и работал только с хэшами. – kch 2009-03-16 00:00:46

ответ

1

Это та вещь, вы» после?

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

Вот метод (затыкать его в/Библиотека и требуют его 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 уже (кредит: Brian Guthrie)

+0

В новых версиях Rails уже есть помощник, который вы реализовали выше (кроме); это может быть излишним, чтобы повторно добавить его. – 2009-03-15 23:46:32

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 (каждый элемент массива являются PARAMS для создания URL)
  • exclude_keys представляет собой массив символов для ключей, которые вы хотите игнорировать
  • request.request_uri может быть не совсем то, что вы должны использовать, см. ниже.

Тогда есть все виды вещей, которые вы хотите учитывать при реализации вашей версии:

  • сделать вы хотите сравнить полный URI с доменом, портом и все, или просто путь?
  • Если только путь, вы хотите сравнить аргументы, переданные после вопросительного знака, или только те, которые составляют фактический путь пути?

 Смежные вопросы

  • Нет связанных вопросов^_^