将rails_admin与rails_api一起使用

时间:2016-04-25 12:13:07

标签: ruby-on-rails rails-admin actionview rails-api ruby-on-rails-5

我最初将其发布为an issue on rails_api GitHub,但由于不活动,我现在将其发布到此处。

我尝试将rails_admin与Rails 5 API应用程序一起使用。我添加了额外的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

I configured extra modules for 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管理控制台似乎运行正常。但是,当我尝试访问应用程序中的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 个答案:

答案 0 :(得分:6)

如果我是你,我会尝试隔离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 here和配置设置here

答案 1 :(得分:3)

v1.0.0(2016年9月发布)起,Rails Admin现在支持直接开箱即用的Rails 5 API模式。 gem本身会注入缺少的中间件来呈现其视图,并且不需要额外的配置。

链接:

答案 2 :(得分:0)

您应该在此位置预订/ index.json.jbuilder中有一个json视图文件 在这个文件里面就像

预订/ index.json.jbuilder

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

这是另一个缺少的模板

  

应用/索引

但真的不完全了解你的应用。也许这就是你使用ActionView :: Layouts实现的应用程序布局。在这种情况下,要求您在位置应用程序/索引中实现布局页面文件。

注意:视图文件夹中的那两个文件。