движки рельсов 3.1.1 - с монтируемыми движками, возможно ли получить доступ к ресурсам родительского приложения, по умолчанию макет - PullRequest
6 голосов
/ 11 октября 2011

Это больше для экспериментов - я знаю, что могу сделать это с --full, но я хотел, чтобы функциональность пространства имен в приложении избегала конфликтов

Идея состоит в том, чтобы иметь основное приложение, котороеобрабатывает аутентификацию, общие элементы, экраны администратора и т. д. Затем создается механизм для добавления дополнительных функций, таких как

  • crm
  • cms
  • blog
  • wiki
  • forum
  • и т. Д.

Эти движки я могу выбирать по мере необходимости для любого приложения, которое я создаю.Возможно ли это?

Это просто случай применения опций --mountable и --full?

Эксперимент - возникнет ли проблема, если я воспользуюсь полной опцией add rspec, а затем просто добавлю

rails plugin new plugin_name --skip-test-unit --full --dummy-path=spec/dummy

и в lib \ plugin_name \ engine.rb

module PluginName
  class Engine < Rails::Engine

    # this is added by rails when an engine is mountable 
    # to isolate the plugin and prevent name clashes
    isolate_namespace PluginName

    # one of the additions to make rspec work from command line for the plugin
    config.generators do |g|
      g.test_framework :rspec, :view_specs => false
    end   
  end
end 

Я уже создал и --full, и --mountable движки, и rspec наконец-то работает для всех, кто читает некоторые замечательные статьи (см. Ниже), но меня интересует, как это повлияет на решение, которое я пытаюсь создать

Я все еще играю с этим и опубликую свои выводы ..
Любая помощь / обсуждение будут высоко оценены.

Обратите внимание

  1. Почему я хочу это сделать - строить один раз много раз ...
  2. Я бы никогда не захотел не-tech / client для добавления «плагинов / движков» - это просто для развлечения пункта 1.

Проблемы, которые у меня возникают ...

  1. Запуск сервера в приложении верхнего уровня.Только при доступе к контенту из движка (я вижу по сообщениям об ошибках) у меня проблема с маршрутизацией (root_path не определен или отсутствуют маршруты разработки) - отображается макет родительского приложения, я вижу его в извлеченном источнике ошибки,Прогресс, но пока нет сигар!

Полезные ссылки

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Мне удалось заставить это работать со следующими шагами:

  1. В моем родительском приложении я монтировал двигатель в route.rb

    mount PluginName::Engine => '/plugin_name'
    

    Я только что удалил.

  2. Создан контроллер приложения, как указано ниже Райаном Биггом.

    class PluginName::ApplicationController < ApplicationController
      ...
    end
    
  3. Поскольку я хотел, чтобы при создании контроллеров, моделей, тестов я располагал пространство имен так, чтобы вы по существу закомментировали isolate_namespace PluginName lib \ plugin_name \ engine.rb, когда я хотел, чтобы гем запускался в родительском объекте. приложение.

    Это еще не идеальное решение. с головы до головы, я мог бы использовать что-то вроде:

    isolate_namespace PluginName if %w[development testing].include?(Rails.env)
    

    но придется проверить, насколько это практично.

Благодарность Райану за то, что он помог мне найти свой путь, большое спасибо

Кроме того, то же самое можно сделать с версией переключателя --mountable, и все, что вам нужно сделать, - это сделать еще один шаг в конфигурации вашего двигателя / router.rb вместо

PluginName::Engine.routes.draw do

с

Rails.application.routes.draw do
1 голос
/ 12 октября 2011

Да, вы можете ссылаться на ресурсы родительского приложения, просто ссылаясь на них в своем приложении, как обычно:

  <%= stylesheet_link_tag "application %>

Хотя, не уверен, почему вы захотите сделать это, потому что ...

Я собираюсь ответить на ваш первый вопрос ответом на ваш второй вопрос.

Чтобы использовать макет приложения, вам нужно изменить ApplicationController в движке (который является пространством имен) и получить его.наследовать от ApplicationController в двигателе.

Это будет иметь контроллеры для двигателя с использованием схемы, предоставленной двигателем.Я делаю это в своем движке, forem .

Однажды это будет рассмотрено в Руководстве по двигателям , которое на данный момент написано в настоящее времяпишется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...