установка корня приложения на маршрут в движке - PullRequest
0 голосов
/ 21 сентября 2018

Я бы хотел установить в корне моего приложения действие контроллера движка.Я думал, что в моем config/routes.rb это будет сделано:

root action: :show, controller: :pages, module: :MyEngine

Но я получаю uninitialized constant PagesController ошибку.Маршруты устанавливаются до автоматической загрузки контроллеров двигателя?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я явно объявил, что контроллер, который я использовал, без интервала имен в config/routes.rb.

PagesController = MyEngine::PagesController

root action: :show, controller: :pages

Это сделало это.Мне интересно, нашел ли я ошибку с опцией module?

0 голосов
/ 21 сентября 2018

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

1) Смонтировать двигатель в корне (вероятно, не совсем то, что вы хотели)

mount MyEngine => '/', as: :myengine

2) Перенаправить root на движок

# For redirecting to the engine's mount
root to: redirect { Rails.application.routes.url_helpers.myengine_path }

# For a specific engine path
root to: redirect { MyEngine.routes.url_helpers.some_path }

Если вы не возражаете жестко прописать путь вашего движка, вы можете просто:

root to: '/myengine/url'

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

class UrlRedirectHelper

  # This makes the case where you just want to use the main app's routes less verbose
  def self.method_missing(method, *args, **kwargs)
    new.public_send(method, *args, **kwargs)
  end

  # This is some entirely unnecessary sugar, I just like the way it reads
  def self.for(engine)
    new(engine)
  end

  def initialize(engine = Rails.application)
    @engine = engine
  end

  # This is called by `redirect` when it's preparing to redirect the user
  def call(_params, _request)
    url_helpers.public_send(@method, *@args, **@kwargs)
  end

  def method_missing(method, *args, **kwargs)
    super unless url_helpers.respond_to? method

    @method = method
    @args = args
    @kwargs = kwargs

    self
  end

  private

  # you could also `delegate` this, but it keeps the API cleaner to make it private
  def url_helpers
    @engine.routes.url_helpers
  end
end

Что тогда используется так:

get :somepath, to: redirect(UrlRedirectHelper.some_other_path)

# or, for an engine
get :somepath, to: redirect(UrlRedirectHelper.for(MyEngine).some_other_path)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...