Подтвердить что ты не робот

Использование правильного метода 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 или в инициализации фиктивного приложения, которое я могу сделать, чтобы убедиться, что используются правильные модули?

4b9b3361

Ответ 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]})) %>