Помощники Rails не работают в тестовой среде - PullRequest
3 голосов
/ 17 июля 2011

Я следовал учебному пособию, доступному по адресу http://railscasts.com/episodes/221-subdomains-in-rails-3.

Это позволяет вам передавать опцию субдомена вашим маршрутам, переопределяя метод url_for в вспомогательном файле.У меня вспомогательный метод выглядит следующим образом:

module UrlHelper
  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  def url_for(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    super
  end
end

так:

sites_homepage_url(:subdomain => "cats") 

производит URL:

"http://cats.example.com/sites/1/homepage" 

Это прекрасно работает в разработке.Однако в моих тестах на огурцы использование:

sites_homepage_url(:subdomain => "cats") 

дает:

"http://www.example.com/sites/1/homepage?subdomain=cats"

, что указывает на то, что функциональность, которую я добавил в url_for в помощнике, не работает.У кого-нибудь есть идеи?

Редактировать: Форматирование и добавить код для UrlHelper.

Ответы [ 3 ]

2 голосов
/ 26 июля 2011

Поскольку другие решения не сработали, вы можете попробовать более сложное.

В файле инициализатора (например, config / initializers / url_for_patch.rb ) добавьте это:

ActionView::Helpers::UrlHelper.class_eval do

  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  alias_method_chain :url_for, :subdomain

  def url_for_with_subdomain(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    url_for_without_subdomain( options )
  end      

end
0 голосов
/ 26 июля 2011

Код в вашем вопросе определяет новый модуль UrlHelper в пространстве имен верхнего уровня. Если вы пытаетесь переопределить методы в ActionView::Helpers::UrlHelper, вам необходимо полностью квалифицировать модуль:

module ActionView
  module Helpers
    module UrlHelper
      def url_for
        # override as in your question
      end
    end
  end
end

Я не уверен, будет ли Rails полностью доволен этим в приложении / помощниках, поэтому вам может понадобиться поместить это в lib/action_view/helpers/url_helper.rb (если вы используете автозагрузку из папки lib), или вы ' Вам нужно явно указать файл в вашем config/application.rb

0 голосов
/ 17 июля 2011

Вы можете попробовать добавить ниже код в вашем интеграционном тестировании

include ActionView::Helpers::UrlHelper
...