3

ruby コマンド ライン アプリケーションとフロントエンド用の Rails アプリケーションの 2 つの部分で構成されるアプリケーションを開発しています。

以下の方法で ActiveRecord と Rails モデルを個別に含めることで、Ruby アプリケーションで使用しています。

Dir[File.dirname(__FILE__) + '/../../RailsApp/app/models/*.rb'].each do |file|
  filename = File.basename(file, File.extname(file))
  require_relative "../../RailsApp/app/models/" + filename
end

そして、依存関係のために2つのほぼ同一のGemfileファイルを手動で維持することによって(私が最善ではないと思うアプローチ)

昨日、Devise を Rails アプリケーションに追加しましたが、Ruby アプリがユーザー モデルをインクルードしようとすると、メッセージundefined method devise for class <xxxxx>が表示されます。

ruby アプリの Gemfile に devise gem を追加しましたが、エラーが続きます。私の理解が正しければ、Devise は Rails Engine です。そのため、gem を要求しただけではロードされません。

Rails モデルを別のアプリケーション内に含めるためのより良い方法は、environment.rbファイルを要求することだと読みましたが、それを試みたところ、ActionMailer でエラーが発生しました。

undefined method `action_mailer' for #<Rails::Application::Configuration:0xbbb54bc>

どうすればdeviseで問題を解決できますか? Rails モデルを別のアプリケーションに含めるには、現在使用している 2 つの gemfile を管理するよりも良い方法はありますか? ありがとう

4

3 に答える 3

5

このアーキテクチャは近い将来変更する必要がありますが、rubyアプリケーションにdeviseとその初期化子を含めることで、このエラーを回避することができました。

# FIXME: Dependency needed in Rails but not in the engine.
require 'devise'
require_relative "../../RailsApp/config/initializers/devise.rb"

#Load all the models
于 2012-05-18T16:49:31.747 に答える
3

モデルを呼び出す前に入れてみることもできrequire 'devise'ますが、うまくいくかどうかはわかりません。

この一般的なアーキテクチャが間違っていると感じることに同意します。

両方のアプリケーションに共通するコードを別のライブラリに抽出し、そのライブラリを両方のアプリケーションに含めます。これを行う最も簡単な方法は、独自のライブラリを Gem に作成し、それを両方の Gemfile に含めることです。共通の gem は共有ライブラリで指定されます。宝石を作るのはとても簡単です。適切な手順については、http://asciicasts.com/episodes/245-new-gem-with-bundler (または関連する Railscast) を参照してください。

あなたのコマンドライン アプリは、おそらく Devise を気にする必要はないはずです。両方で User モデルが必要な場合は、それを共有ライブラリに含めてから、Rails アプリに追加機能 (Devise など) を追加するだけです。

それは役に立ちますか?

于 2012-05-18T15:04:19.880 に答える
0

モデルのロード時を、gem 自体のロード時ではなく、親アプリの初期化ステップに移動できます。

他の回答が示唆するように、shared_code gem を作成します。

shared_code 読み込みループを初期化ファイルに移動します (require 'user' など)。

モデルの gem 依存関係 (devise など) を shared_code gemspec にリストします。

shared_code gem にジェネレーターを含めて、shared_code gem を使用するアプリに初期化ファイルをインストールします。

次に、親アプリで共有コードを使用するには、

Gemfile:

gem 'shared_code'

コンソール:

rails generate shared_code:install

これは、devise や他の gem が、親アプリケーションの初期化シーケンスで適切なタイミングで自分自身を構成するために使用するパターンと同じです。

user.rb ファイル自体、shared_code gem 内のデバイス初期化子で require_relative を使用すると、shared_code を使用している 2 つの異なる親アプリケーションがデバイス (またはアプリとあなたの宝石は異なる)に依存します。

ジェネレーターの詳細:

次のようにジェネレーターを作成することで、shared_code:install コマンドを作成できます。

lib/generators/shared_code/install_generator.rb

module SharedCode
  class InstallGenerator < Rails::Generators::Base
    source_root File.expand_path('../templates', __FILE__)
    def copy_initializer_file
      copy_file "shared_code.rb", "config/initializers/shared_code.rb"
    end
  end
end

モデルのロード コードを lib/generators/shared_code/templates/shared_code.rb に配置します。

于 2012-10-25T02:14:48.547 に答える