【问题标题】:Using rails_admin with rails_api将 rails_admin 与 rails_api 一起使用
【发布时间】:2016-08-18 19:47:48
【问题描述】:

我最初以an issue on rails_api GitHub 发布此内容,但由于不活跃,现在将其发布在此处。

我正在尝试将rails_admin 与 Rails 5 API 应用程序一起使用。我包含了额外的 ActionController 模块,直到我可以拥有一个正常工作的 rails_admin 面板或工作 API 请求。问题似乎是 rails_admin 依赖于ActionView::Layouts,在包含之后会导致 API 请求出现问题。

宝石文件:

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,应用控制器:

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 后才会发生这种情况。

【问题讨论】:

  • 您的BookingsControllerTest 中有什么内容?我认为这会有所帮助,因为这就是问题所在......
  • 您是否尝试过像 rails-api 推荐的那样使用ActiveModel::Serializers

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    链接:

    【讨论】:

    • 这是真的!同时,我采取了更新 rails_admin 并删除了上面提到的自定义解决方案。
    • 如果我没记错的话,它一直工作到1.1.0;我现在使用 Rails 5.1.2 和 rails_admin 1.2 得到ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
    • 是的,没错。我描述了一个未解决的问题here
    • Devise 和它的登录视图怎么样?
    【解决方案3】:

    你应该在这个位置有一个 json 视图文件 bookings/index.json.jbuilder 在这个文件里面像

    bookings/index.json.jbuilder

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

    这是另一个缺少的模板

    应用程序/索引

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

    注意:views 文件夹中的这两个文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多