Использование правильного метода url_for в спецификации Rails
У меня есть спецификация запроса в Rails-движке. Представленное представление вызывает маршрут и переходит в хеш, т.е. projects_path(:scope => "user")
. Такой маршрут в конечном итоге вызовет url_for
, но url_for
определяется во многих местах. При запуске приложения или выполнении спецификации запроса в главном приложении (корневой уровень) цепочка вызовов заканчивается на ActionView::RoutingUrlFor#url_for
; однако при запуске спецификации в движке цепочка вызовов заканчивается на ActionView::Helpers::UrlHelper#url_for
.
В Rails 4 метод url_for
, определенный в UrlHelper
, больше не принимает хэш-аргументы, поэтому я остался с этой ошибкой
Failure/Error: visit projects_opportunity_intakes_path
ActionView::Template::Error:
arguments passed to url_for can't be handled. Please require routes or provide your own implementation
То, что я пытаюсь понять, - это то, почему он возвращается на ActionView::Helpers::UrlHelper
, когда я запускаю спецификацию в своем движке, но не в любом другом случае. Это довольно сложно. Одна вещь, которая выделяется для меня: когда я помещаю точку останова в свою точку зрения и оцениваю self.class
, я обычно получаю что-то, что наследуется от ActionView::Base
, но когда я запускаю spec из моего движка, класс не наследует от что-нибудь. Я не знаю, связано ли это, но кажется подозрительным.
Кто-нибудь испытывает это? Знать дорогу вокруг него? Могут ли мои модули быть включены в неправильный порядок? Есть ли что-то в spec_helper
или в инициализации фиктивного приложения, которое я могу сделать, чтобы убедиться, что используются правильные модули?
Ответы
Ответ 1
У меня была такая же проблема при обновлении до Rails 4, и я обнаружил, что проблема была моделью, содержащей следующую строку:
include Rails.application.routes.url_helpers
Попробуйте найти код в приложении, где url_helpers
где-то есть. Удаление этой строки должно помочь решить проблему.
Ответ 2
Мне кажется, проблема в том, что конфликты include ActionView::Helpers
и include Rails.application.routes.url_helpers
конфликтуют друг с другом.
Я обнаружил, что если вы положили ActionView::Helpers
, то сначала это не вызывает ошибки. Поэтому измените
include Rails.application.routes.url_helpers
include ActionView::Helpers
к
include ActionView::Helpers
include Rails.application.routes.url_helpers
Ответ 3
включить ActionView:: Helpers:: UrlHelper → В моем случае это была строка, которую я должен был искать и комментировать.
Ответ 4
Для меня проблема была вызвана передачей хеша в качестве второго аргумента строки link_to.
<%= link_to('click me', {one: params[:one], two: params[:two]}) %>
обертывание хеша в методе фактического пути для страницы решило проблему
<%= link_to('click me', actual_path({one: params[:one], two: params[:two]})) %>