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

Именованные маршруты в установленном рельсовом двигателе

Я делаю небольшой рельсовый движок, который я монтирую следующим образом:

mount BasicApp::Engine => "/app"

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

Однако - когда я (внутри двигателя) ссылаюсь на именованный маршрут (определенный внутри движка), я получаю эту ошибку

undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>

Запуск "рейк-маршрута" четко подтверждает, что "new_post" должен быть именованным путем, поэтому я понятия не имею, почему Rails (3.1.0) не может понять это. Любая помощь приветствуется

my config/route.rb(для движка) выглядит следующим образом

BasicApp::Engine.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
        end
end

Я должен добавить, что это и изолированный движок. Однако пути, подобные main_app.root_path, работают нормально - в то время как root_path не

4b9b3361

Ответ 1

Правильный путь

Я считаю, что лучшим решением является вызов new_post_path в прокси-сервер Маршрутов Engine, который доступен как вспомогательный метод. В вашем случае метод помощника по умолчанию будет basic_app_engine, поэтому вы можете вызвать basic_app_engine.new_post_path в своих представлениях или помощниках.

Если вы хотите, вы можете установить имя одним из двух способов.

# in engine/lib/basic_app/engine.rb:
module BasicApp
  class Engine < ::Rails::Engine
    engine_name 'basic'
  end
end

или

# in app/config/routes.rb:
mount BasicApp::Engine => '/app', :as => 'basic'

В любом случае вы можете вызвать basic.new_posts_path в своих представлениях или помощниках.

Другой способ

Другой вариант - не использовать смонтированный движок, и вместо этого двигатель добавляет маршруты непосредственно в приложение. Thoughtbot HighVoltage делает это. Я не люблю это решение, потому что он может вызвать конфликты пространства имен при добавлении многих движков, но он работает.

# in engine/config/routes.rb
Rails.application.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
  end
end

# in app/config/routes.rb:
# (no mention of the engine)

Ответ 2

В Rails 4 директива engine_name не работала для меня.
Чтобы получить доступ к именованному маршруту, определенному в маршрутах двигателя, из собственного представления или контроллера двигателя, я закончил использование подробного

BasicApp::Engine.routes.url_helpers.new_post_path

Я рекомендую определить простой вспомогательный метод, чтобы сделать его более удобным

# in /helpers/basic_app/application_helper.rb

module BasicApp::ApplicationHelper
  def basic_app_engine
    @@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
  end
end

Теперь вы можете использовать

basic_app_engine.new_post_path

Если вам нужен доступ к основному помощнику приложения из механизма, вы можете просто использовать main_app:

main_app.root_path

Ответ 3

используйте нижеприведенное приложение для доступа к маршрутам двигателя

MyApp::Engine.routes.url_helpers.new_post_path