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::All
やAbstractController::Rendering
などのモジュールを追加しようとしましたが成功しませんでした。
親クラスをActionController :: Baseに変更すると、すべてが期待どおりに機能します。しかし、私はフルクラスの肥大化を継承したくありません。スリムなAPIバージョンが必要です。
はい、ApplicationControllerからインデックスを提供する場合、その基本クラスを変更すると、他のすべてのコントローラーに影響します。これは良くない。しかし、このページを提供するための専用コントローラーがある場合はどうでしょうか。
class StaticPagesController < ActionController::Base
def index
render file: 'public/index.html'
end
end
このように、「肥大化した」コントローラーは1つだけで、他のコントローラーはスリムで高速なままです。
これは機能するはずであり、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で変更されました。
あなたができる
render text: File.read(Rails.root.join('public', 'index.html')), layout: false