Вспомогательные методы URL-адреса рельсов не определены с использованием полных движков

Рельсы 3.2.12 27.02.2013

У нас есть полноценный движок rails под названием base2_cms с моделью под названием "Event". Нет проблем с запуском движка с использованием сервера rails.

Затем еще один полный движок rails под названием base2_cvb с использованием base2_cms, упакованный как гем. В этом нет проблем.

Затем приложение использует оба этих движка как драгоценные камни. Мы делаем это с тех пор, как вышли первые движки, но недавно внесли много изменений. Где-то по ходу маршрутизация перестала работать. Или, точнее, вспомогательные методы ссылки на рельсы.

На уровне приложения при использовании link_to со вторым параметром в качестве экземпляра события возникает такая ошибка:

undefined method `event_path' for #<#<Class:0x007f82d52b3c20>:0x007f82d52a7240>

трассировки стека:

actionpack (3.2.11) lib/action_dispatch/routing/polymorphic_routes.rb:129:in `polymorphic_url'

actionpack (3.2.11) lib/action_dispatch/routing/polymorphic_routes.rb:135:in `polymorphic_path'

actionpack (3.2.11) lib/action_view/helpers/url_helper.rb:111:in `url_for'

actionpack (3.2.11) lib/action_view/helpers/url_helper.rb:242:in `link_to'

base2_cms (0.9.40) app/helpers/application_helper_fieldset.rb:31:in `fieldset_combined_title'

base2_cms (0.9.40) app/helpers/application_helper_index.rb:35:in `index_start'

base2_cms (0.9.40) app/views/organizations/index.html.erb:2:in 

Это не связано конкретно с полиморфией, так как у нас есть другие подобные проблемы, такие как получение этой ошибки в другом случае:

In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers

Мы пытались следовать этому последнему совету различными способами, но безуспешно среди многих других попыток решения.

Запуск rake route на уровне приложения возвращает следующее относительно модели событий:

GET    /events/:id/copy(.:format)                 events#copy
DELETE /events/:id/remove_organization(.:format)  events#remove_organization
POST   /events/:id/add_organization(.:format)     events#add_organization
GET    /events(.:format)                          events#index
POST   /events(.:format)                          events#create
GET    /events/new(.:format)                      events#new
GET    /events/:id/edit(.:format)                 events#edit
GET    /events/:id(.:format)                      events#show
PUT    /events/:id(.:format)                      events#update
DELETE /events/:id(.:format)                      events#destroy

Используя консоль rails на финальном уровне приложения, мы можем сделать даже это:

1.9.2-p320 :011 > app.event_path(9)
 => "/events/9" 
1.9.2-p320 :012 > app.event_path(Event.find(88))
  Event Load (13.1ms)  SELECT "events".* FROM "events" WHERE "events"."id" = $1 LIMIT 1      [["id", 88]]
 => "/events/88" 

Но при использовании link_to в представлении невозможно найти метод event_path, как описано выше.


person Frank    schedule 28.02.2013    source источник
comment
У ваших драгоценных камней есть изолированное пространство имен? Как вы монтируете маршруты Engine (как base2_cms с base2_cvb, так и base2_cvb с MainApp)? Это может помочь, edgeapi. rubyonrails.org/classes/Rails/   -  person westonplatter    schedule 08.03.2013
comment
попробуйте main_app.event_path в своих представлениях   -  person NARKOZ    schedule 24.06.2013


Ответы (1)


Когда вы используете движки, вы должны указать, является ли маршрут основным приложением или движком, если это из основного приложения, вы можете сделать это с помощью

main_app.event_path

если это из движка base2_cms, вы можете поставить

base2_cms.event_path

или если это движок base2_cvb:

base2_cvb.event_path

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

person joseramonc    schedule 18.10.2013