7

Originariamente pubblicato come an issue on rails_api GitHub, ma ora lo sto postando per inattività.Utilizzo di rails_admin con rails_api

Sto cercando di utilizzare rails_admin con un'applicazione API Rails 5. Ho incluso moduli ActionController extra fino al punto in cui posso avere un pannello rails_admin funzionante o richieste API funzionanti. Il problema sembra essere che rails_admin dipende da ActionView::Layouts, che dopo aver incluso causa problemi per le richieste 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' 

ho configurato la mia applicazione per utilizzare 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 

Con queste modifiche il cruscotto Rails Admin sembra funzionare bene . Tuttavia, quando sto cercando di accedere alle risorse JSON nella mia richiesta, è gettato il seguente errore:

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" 

Il codice di prova (provato anche l'aggiunta di format: :json):

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

    assert_response :success 
    end 
end 

Questo è il controller codice:

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

Questo avviene solo dopo che ho includere il modulo ActionView::Layouts nel livello superiore ActionController::API categoria a supportare Rails Admin.

+0

Qual è nel vostro 'BookingsControllerTest'? Penso che sarebbe d'aiuto sapere, poiché è qui che il problema è ... – Uzbekjon

+0

@Uzbekjon aggiunto. – richard

+0

Hai provato a utilizzare [ActiveModel :: Serializer] (https://github.com/rails-api/active_model_serializers) come consigliato da rails-api? – trueinViso

risposta

3

Se fossi in te, provo a isolare i controller API e RailsAdmin. Penso che questo deve funzionare:

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 

In config/initializers/rails_admin.rb

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

Basta controllare il RailsAdmin::ApplicationControllerhere, e le impostazioni di configurazione here.

0

Si dovrebbe avere un file JSON vista in questo prenotazione posizione/index.json.jbuilder E dentro questo file qualcosa come

prenotazioni/index.json.jbuilder

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

Questo è un altro modello mancante

applicazione/index

ma in realtà non conosco app completamente. Quindi forse questo è il layout dell'applicazione che hai implementato usando ActionView :: Layouts. In tal caso ti viene chiesto di implementare un file di pagina di layout nell'applicazione/indice di posizione.

NOTA: Questi due file all'interno della cartella delle viste.

2

A partire da v1.0.0 (rilasciato a settembre 2016), Rails Admin ora supporta subito la modalità API di Rails 5 in modo immediato. La gem in sé inietta il middleware mancante per renderizzare le sue viste e non è richiesta alcuna configurazione aggiuntiva.

vicini:

+0

Questo è vero! Nel frattempo ho fatto ricorso all'aggiornamento di rails_admin e alla rimozione della soluzione personalizzata di cui sopra. – richard

+0

Ha funzionato fino alla versione 1.1.0 se non sbaglio; Ottengo 'ActionController :: InvalidAuthenticityToken (ActionController :: InvalidAuthenticityToken):' ora con Rails 5.1.2 e rails_admin 1.2 –

+0

Sì, è corretto. C'è un problema aperto con questo che descrivo [qui] (http://www.carlosramireziii.com/how-to-use-rails-admin-with-a-rails-5-api-application.html#comment-3399871556) –

Problemi correlati