В настоящее время я работаю над движком Rails, который будет дублировать маршрутизацию хост-приложения в определенной области. Таким образом, если маршрут get '/posts', to: 'posts#index', as: 'posts'
существует в исходном приложении, этот маршрут также должен быть доступен под креплением двигателя get '/mount/posts'
, но должен указывать на то же действие Contoller # в хост-приложении. Однако у меня нет доступа к окончательному приложению, поэтому маршруты нужно генерировать динамически.
Вот мой нынешний подход, но, может быть, он работает лучше по-другому?
# lib/embed_me.rb
require "embed_me/engine"
module EmbedMe
# defines a scoped route under which the embedded content can be found
mattr_accessor :scope_name, default: :embed
end
# lib/embed_me/engine.rb
module EmbedMe
class Engine < ::Rails::Engine
isolate_namespace EmbedMe
initializer "embed_me", before: :load_config_initializers do |app|
Rails.application.routes.append do
mount EmbedMe::Engine, at: EmbedMe.scope_name
end
end
end
end
# config/routes.rb
EmbedMe::Engine.routes.draw do
match '/*path', to: 'application#index', via: :all
end
# app/controllers/embed_me/application_controller.rb
module EmbedMe
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def index
# will validate existance of route, or raise ActionController::RoutingError
path = Rails.application.routes.recognize_path(params[:path])
controller = path[:controller]
action = path[:action]
# how to call original action?
end
end
end
Я не могу использовать redirect_to("/#{params[:path]}")
, потому что это изменит URL-адрес на URL-адрес без области действия. Я не могу использовать render(action: action, controller: controller)
, потому что будут отображаться только соответствующие представления, но логика в контроллере будет пропущена. (или я сделал что-то в корне неправильно?) Я не могу использовать main_app.resource_path
, потому что маршруты не статичны и варьируются от приложения к приложению.
Я также просмотрел ссылку и Ссылка , но тоже не мог заставить это работать