путь не работает должным образом при использовании капибары

Я использую рельсы 3.0.5, rspec2 с последней капибарой.

Маршруты настроены так:

scope "(:locale)", :locale => /de|fr|it|en/ do
  resources :dossiers
end

В application_controller у меня есть это:

def default_url_options(options={})
  options[:locale] = "es"
  options
end

Итак, в моих взглядах я могу использовать

link_to 'test', dossier_path(1)

без проблем.

Но когда я делаю то же самое при посещении капибары, он пытается использовать 1 для локали, а не для идентификатора. Это работает только тогда, когда я использую

visit dossier_path(nil, 1)

or

visit dossier_path(:id => 1)

Но оба уродливы и выглядят как грязный хак. Итак, зачем мне использовать этот грязный хак и что мне делать, чтобы я мог использовать методы пути точно так же, как в представлениях (то есть без грязного хака, связанного с необходимостью добавлять nil или явно передавать :id => . ..)? :)


person gucki    schedule 22.03.2011    source источник
comment
Название вашего вопроса указывает на то, что это ответ, а не вопрос. После прочтения содержания это впечатление не сильно изменилось. Что именно вы ищете?   -  person polarblau    schedule 23.03.2011
comment
Я ищу ответ, почему мне нужно использовать грязный хак, который я показал, и что я могу сделать, чтобы я мог использовать метод так же, как в представлениях (так что без грязного хака, связанного с необходимостью добавлять nil или явно передавать: id знак равно   -  person gucki    schedule 23.03.2011
comment
Извините, я только что увидел, что название было неправильным. Вместо сейчас должно было быть не так, я просто исправил ;)   -  person gucki    schedule 23.03.2011
comment
кажется, капибара не проходит через ваш контроллер приложений, поэтому она не может правильно пройти по вашим путям. что вы можете сделать, так это сделать помощник по шагам, чтобы исправить ваши маршруты для капибары   -  person corroded    schedule 23.03.2011
comment
не могли бы вы привести пример? он должен работать не только для dossier_path, но и для любого пути. если вы добавите это как ответ, я могу проголосовать за него :)   -  person gucki    schedule 23.03.2011


Ответы (4)


Я столкнулся с похожей проблемой. Вы можете установить default_url_options в блоке before, подобном этому, в спецификациях запроса:

 before :each do
   app.default_url_options = { :locale => :es }
 end
person effkay    schedule 06.10.2011
comment
Просто чтобы добавить немного больше контекста для этого: приведенный выше код должен быть где-то внутри блока Rspec.configure do |config|. - person Lenart; 05.01.2015

К сожалению, генерация маршрута происходит за пределами Application Controller. И Capybara не делает ничего волшебного, чтобы предоставить параметры URL-адреса по умолчанию для помощников маршрутизации.

Но вы можете указать локаль по умолчанию внутри вашего route.rb

scope "(:locale)", :locale => /de|fr|it|en/, :defaults => { :locale => "es" } do
  resources :dossiers
end

И теперь, если вы не передадите параметр :locale помощнику маршрута, по умолчанию он будет равен "es". На самом деле больше нет необходимости хранить def default_url_options в вашем контроллере.

person Simon Perepelitsa    schedule 17.08.2011
comment
Как насчет значений по умолчанию, которые зависят, например, от current_user? - person gucki; 18.08.2011
comment
Это плохой ответ, даже я сначала проголосовал за него. Это заставляет ваши тесты проходить, но половина ссылки в самом приложении застревает в локали по умолчанию. - person firedev; 21.01.2014

Я запускаю рельсы 3.2.6 и использую технику, которую нашел здесь https://github.com/rspec/rspec-rails/issues/255 под комментарием Фоэта. Просто поместите это куда-нибудь в /spec/support, и оно должно соответствовать всем вашим спецификациям.

class ActionView::TestCase::TestController
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end

class ActionDispatch::Routing::RouteSet
  def default_url_options(options={})
    { :locale => I18n.default_locale }
  end
end
person Chris Beck    schedule 18.08.2012

Наоборот, как показано здесь в разделе Использование Capybara с RSpec. в состоянии заставить его работать пишет

visit user_path(:id => myuser.id.to_s)

поэтому для вас это должно быть

visit dossier_path(:id => "1")

Это работает?

person Enrico Carlesso    schedule 19.07.2011
comment
Извините, я не понимаю, как это связано с моим вопросом о том, что параметры URL-адреса по умолчанию не используются? - person gucki; 20.07.2011