web-dev-qa-db-ja.com

Rails 5 APIでファイルをレンダリングする方法は?

React with Ruby on Rails back-end(API mode)。= Railsは静的ファイルも提供しています。私はRailsルーターをpublic/index.htmlに向けているので、SPAはreact-routerを使用して独自のルーティングを管理できます。これは一般的な方法です。直接リンクを作成し、動作するように更新します。

routes.rb

match '*all', to: 'application#index', via: [:get]

application_controller.rb

class ApplicationController < ActionController::API
  def index
    render file: 'public/index.html'
  end
end

問題は、これがAPIモードでは機能しないことです。それはただの空の応答です。親クラスをActionController::Baseに変更すると、すべてが期待どおりに機能します。しかし、私はフルクラスの肥大化を継承したくありません。スリムなAPIバージョンが必要です。

ActionController::Renderers::AllAbstractController::Renderingなどのモジュールを追加しようとしましたが成功しませんでした。

8
yeasayer

親クラスをActionController :: Baseに変更すると、すべてが期待どおりに機能します。しかし、私はフルクラスの肥大化を継承したくありません。スリムなAPIバージョンが必要です。

はい、ApplicationControllerからインデックスを提供する場合、その基本クラスを変更すると、他のすべてのコントローラーに影響します。これは良くない。しかし、このページを提供するための専用コントローラーがある場合はどうでしょうか。

class StaticPagesController < ActionController::Base
  def index
    render file: 'public/index.html'
  end
end

このように、「肥大化した」コントローラーは1つだけで、他のコントローラーはスリムで高速なままです。

13

これは機能するはずであり、ActionController :: APIから継承し続けることができます-

class ApplicationController < ActionController::API
  def index
    respond_to do |format|
      format.html { render body: Rails.root.join('public/index.html').read }
    end
  end
end

ActionController :: APIのレンダリングロジックがRails 5で変更されました。

1

あなたができる

render text: File.read(Rails.root.join('public', 'index.html')), layout: false
0
Kris