Как я могу сделать маршруты из двигателя Rails 3, доступные для приложения хоста?
-
08-10-2019 - |
Вопрос
У меня есть приложение Rails 3 с несколькими двигателями, содержащими дополнительные функциональные возможности. Каждый двигатель - это отдельная служба, которую клиенты могут приобрести доступ.
Я, однако, имею проблему с маршрутами из двигателей, которые не доступны контроллерам и представлениям.
Контроллер:
class ClassroomsController < ApplicationController
..
respond_to :html
def index
respond_with(@classrooms = @company.classrooms.all)
end
def new
respond_with(@classroom = @company.classrooms.build)
end
..
end
app/views/classrooms/new.html.haml
:
= form_for @classroom do |f|
..
f.submit
config/routes.rb
В двигателе:
MyEngineName::Engine.routes.draw do
resources :classrooms
end
config/routes.rb
В приложении:
Seabed::Application.routes.draw do
mount MyEngineName::Engine => '/engine'
...
end
lib/my_engine_name.rb
В двигателе:
module MyEngineName
class Engine < ::Rails::Engine
end
end
пытаясь пойти в /classrooms/new
приводит к
NoMethodError in Classrooms#new
Showing app/views/classrooms/_form.html.haml where line #1 raised:
undefined method `hash_for_classrooms_path' for #<Module:0x00000104cff0f8>
и пытаясь позвонить classrooms_path
Из любого другого представления приводит к той же ошибке. Я могу, однако, позвонить MyEngineName::Engine.routes.url_helpers.classrooms_path
и заставить его работать. Я думаю, что я мог бы определить неправильные маршруты, но не могу найти другой способ, которым работает.
Попробовал запустить приложение с оба пассажирским (автономным модулем) и Webrick (сервер Rails). Использование новейших рельсов из Git (7c920631ec3b314cfaa3a60d265de40cba3e8135
).
Решение
Изменять config.routes
В вашем двигателе до:
Rails.application.routes.draw do # NOT MyEngineName::Engine.routes.draw
resources :classrooms
end
Как у вас есть, маршруты доступны только в MyEngineName::Engine
пространство имен, а не в остальных приложениях хост-рельсов.
Раньше было сообщением в блоге с большей информацией, но, к сожалению, это больше не доступно:
Другие советы
У меня была такая же проблема, и нашла это в документация:
Поскольку теперь вы можете установить двигатель внутри маршрутов приложения, у вас нет прямого доступа к URL_HELPERS URL_HELPERS Engine. Когда вы устанавливаете двигатель в маршрутах приложения, создан специальный помощник, чтобы позволить вам это сделать. Рассмотрим такой сценарий:
# config/routes.rb
MyApplication::Application.routes.draw do
mount MyEngine::Engine => "/my_engine", :as => "my_engine"
get "/foo" => "foo#index"
end
Теперь вы можете использовать помощник My_Engine в вашем приложении:
class FooController < ApplicationController
def index
my_engine.root_url #=> /my_engine/
end
end
Для меня также помогают добавить
require 'engine' if defined?(Rails)
к моему основным файлам GEM (lib / .rb).
Хороший пример - https://github.com/mankind/rails-3-engine-example/blob/master/lib/dummy.rb.