Нет серебряной пули для объединения шаблонов на стороне сервера и на стороне клиента.Даже если вы можете визуализировать шаблоны Vue на сервере, ключевой контекст отсутствует (интерактивное состояние страницы в клиенте).
Существует несколько довольно простых, но некорректных методов, которые вы можете использовать для объединения рендеринга на стороне сервера и клиента:
Создание контроллера, обслуживающего ваши представления
Rails.application.routes.draw do
scope 'templates' do
get '*path', to: 'templates#show'
end
end
class TemplatesController < ApplicationController
def show
if lookup_context.exists?(params[:path])
render template: params[:path]
else
head :not_found
end
end
end
require 'rails_helper'
RSpec.describe "Templates", type: :request do
describe "GET /template/*path" do
it "fetches template if it exists" do
get '/templates/foo/bar.html.erb'
expect(response).to have_http_status(200)
expect(response.body).to match "TEST"
end
it "returns 404 if it does not exist" do
get '/templates/foo/non_existant.html.erb'
expect(response).to have_http_status(:not_found)
end
end
end
Однако дьявол кроется в деталях - это действительно сработает, если ваши представления полностью статичны и не требуют никаких входных данных.
Визуализация представлений без макета
Если вы вместо этого хотите нормально выполнять рендеринг с ваших контроллеров, но не включаете весь макет, вы можете зарегистрировать пользовательский формат:
# config/initializers/mime_types.rb
Mime::Type.register "text/x-html-template", :template
Иногда вам может потребоваться остановить пружину, чтобы изменения конфигурациибыть поднятым.
Затем вы можете отключить макет для этого формата:
class ApplicationController < ActionController::Base
before_action :add_html_to_template_lookup!, if: -> { request.format.template? }
layout :is_template_request?
private
def is_template_request?
request.format.template? ? false : "application"
end
# this will make rails fall back to rendering the "normal" html views
def add_html_to_template_lookup!
request.formats << Mime::Type.lookup("text/html")
end
end