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

StackOverflow https://stackoverflow.com/questions/4361050

Вопрос

У меня есть приложение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top