ruby-on-rails - скачать - семь баз за семь недель pdf




Каков наилучший способ в Rails определить, равны ли два(или более) заданных URL(как строки или хэш-варианты)? (2)

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

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 

Вот метод (запишите его в / 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 Хэша:

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




routes