0

Rails 3.2.6 アプリケーションを使用するにはログインが必要です。また/api、認証を必要とせずに特定の部分に JSON API を提供する Rails Engine がマウントされています。

Rails サーバーを立ち上げて、次のリクエストを行うと:

GET /api/something
GET /
GET /api/something

すべてが期待どおりに機能し、API 要求は本来の JSON を返し、ホームページは html ページをレンダリングします。

ここが奇妙な部分です。Railsサーバーを起動した直後にこの順序でリクエストを行うと:

GET /
GET /api/something
GET /api/something

その後、API リクエストは失敗します。ルート Rails アプリからの before フィルターが API エンジンに対して発火し、API エンジンにUserSessionsController#new存在しない へのリダイレクトを引き起こし、失敗します。一方、ルート Rails アプリではなく、最初に API エンジンにリクエストを行うと、API エンジンはフィルターの前に継承しません。この奇妙さに光を当てるのは素晴らしいことです:)

私の現在の計画は、API エンジンを適切に自己完結型の Rack アプリに変えることです。この時点でそれがエンジンである唯一の理由は、私の前に誰かが本当にエンジンが好きだったからだと思われます.

4

1 に答える 1

1

たくさん掘り下げた後、私は問題を見つけました。それはエンジン自体にありました。私はプロジェクトの作成に責任を負っていないことを指摘しておく必要があります。

ホストのRailsアプリに...

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  before_filter :foo_bar
  layout :application
end

そして、私たちのエンジンは api_engine と呼ばれ、ApiEngineモジュールの下に分離され、...

app/controllers/api_engine/application_controller.rb:

module ApiEngine
  class ApplicationController < ActionController::Base
    layout false
  end
end

app/controllers/api_engine/post_controller.rb:

module ApiEngine
  class PostController < ApplicationController
    # code goes here...
  end
end

私がこれでどこに行くのか、もうわかりますか?問題は、Rails の動的ローディングと、愚かなエンジンの構造化の組み合わせです。

サーバーに対する最初の要求がエンジンの に対するものである場合、モジュール内の定数に遭遇PostControllerするpost_controller.rbファイルが必要です。が定義されていないので、そうであるかどうかをチェックします。ApplicationControllerApiEngine::ApiEngine::ApplicationController::ApplicationControllerapplication_controller.rb

ただし、最初のリクエストが を定義するホスト アプリに送信されたApplicationController場合、エンジンがリクエストを受け取ると、単にApplicationControllerルート アプリから使用することになり、独自のバージョンのクラスを必要とすることはありません。

解決策はかなり単純で、エンジンのファイルで、ブロックlib/api_engine/engine.rb内に正しいアプリケーション コントローラー ファイルが必要です。config.after_initialize

module ApiEngine
  class Engine < Rails::Engine
    isolate_namespace ApiEngine
    config.after_initialize do
      require "api_engine/application_controller"
    end
  end
end

特に他人のコードを扱う場合、特定の「基本的な」ことが正常に機能していると想定しがちです。他の誰かが同様の奇妙な状況に陥った場合、この回答が役立つことを願っています:)

于 2012-07-12T19:25:06.883 に答える