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

Как я могу сделать маршруты из механизма Rails 3 доступным для хост-приложения?

У меня есть приложение 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 и заставить его работать. Я думаю, что я мог бы определить маршруты неправильно, но не могу найти другой способ, который работает.

Пробовал приложение с помощью как Passenger (автономный, так и Apache-модуль) и WEBrick (сервер rails). Использование последних Rails из Git (7c920631ec3b314cfaa3a60d265de40cba3e8135).

4b9b3361

Ответ 1

Измените config.routes в своем модуле на:

Rails.application.routes.draw do  # NOT MyEngineName::Engine.routes.draw
  resources :classrooms
end

То, как вы это делаете, маршруты доступны только в пространстве имен MyEngineName::Engine, а не в остальной части приложения хостов.

Раньше существовало сообщение в блоге с дополнительной информацией, но, к сожалению, оно больше не доступно:

Ответ 2

У меня была та же проблема, и я нашел это в документации :

Поскольку теперь вы можете монтировать движок внутри маршрутов приложений, у вас нет прямого доступа к 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