Использование Rails admin с rails api

я первоначально написал это как проблема на rails_api GitHub, но теперь я размещаю его здесь из-за бездействия.

я пытаюсь использовать rails_admin С приложением API Rails 5. Я включил дополнительные модули ActionController до такой степени, что у меня может быть функционирующая панель rails_admin или рабочие запросы API. Проблема в том, что rails_admin зависит от ActionView::Layouts, который после включения вызывает проблемы для API запросы.

Gemfile:

gem 'rails', '>= 5.0.0.beta3', '< 5.1'
...
gem 'rack-pjax', github: 'afcapel/rack-pjax'
gem 'remotipart', github: 'mshibuya/remotipart'
gem 'kaminari', github: 'amatsuda/kaminari', branch: '0-17-stable'
gem 'rails_admin', github: 'sferik/rails_admin'

я настроил свое приложение для использования ActionDispatch::Flash:

module MyApp
  class Application < Rails::Application
    ...
    config.middleware.use ActionDispatch::Flash
  end
end

я настроил дополнительные модули для Rails API, ApplicationController:

class ApplicationController < ActionController::API
  include Knock::Authenticatable
  include Pundit

  # RailsAdmin support
  include AbstractController::Helpers
  include ActionController::Flash
  include ActionController::RequestForgeryProtection
  include ActionController::MimeResponds
  include ActionController::HttpAuthentication::Basic::ControllerMethods
  include ActionView::Layouts
end

С этими изменениями панель управления Rails Admin, похоже, работает нормально. Однако, когда я пытаюсь получить доступ к ресурсам JSON в моем приложении, возникает следующая ошибка:

Error:
BookingsControllerTest#test_should_get_index:
ActionView::MissingTemplate: Missing template bookings/index, application/index with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :haml]}. Searched in:
  * "/Users/richard/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/bundler/gems/rails_admin-355dc80f8a20/app/views"

тестовый код (также попытался добавить format: :json):

class BookingsControllerTest < ActionController::TestCase
  test 'should get index' do
    get :index

    assert_response :success
  end
end

это код контроллера:

class BookingsController < ApplicationController
  def index
    @bookings = find_bookings
    render json: @bookings, include: ['customer', 'client'], meta: meta
  end
end

это произойдет только после того, как я включаю ActionView::Layouts модуль на верхнем уровне ActionController::API класс для поддержки Rails Admin.

3 ответов


на вашем месте я бы попытался изолировать контроллеры API и RailsAdmin. Я думаю, это должно сработать:

class ApplicationController < ActionController::API
  include Knock::Authenticatable
  include Pundit
end

class RailsAdminCustomController < ApplicationController
  # RailsAdmin support
  include AbstractController::Helpers
  include ActionController::Flash
  include ActionController::RequestForgeryProtection
  include ActionController::MimeResponds
  include ActionController::HttpAuthentication::Basic::ControllerMethods
  include ActionView::Layouts
end

на config/initializers/rails_admin.rb

RailsAdmin.config do |config|
  # other config stuff ...
  config.parent_controller = '::RailsAdminCustomController'
end

проверить RailsAdmin::ApplicationController здесь и настройки конфигурации здесь.


по состоянию на v1.0.0 (выпущен в сентябре 2016), Rails Admin теперь поддерживает Rails 5 API-mode прямо из коробки. Сам gem вводит отсутствующее промежуточное ПО для отображения своих представлений, и нет необходимости в дополнительной конфигурации.

ссылки:


у вас должен быть файл представления json в этом местоположении bookings/index.формат JSON.на JBuilder И внутри этого файла что-то вроде

заказы индекс/.формат JSON.на JBuilder

json.name @bookings.name
json.date @bookings.date

это еще один шаблон отсутствует

application / index

но на самом деле не знаю, что вы полностью приложение. Так что, возможно, это макет приложения, который вы реализовали с помощью ActionView:: Layouts. В этом случае запрашивается реализация файла страницы макета в расположение приложения/индекса.

примечание: эти два файла внутри папки views.