0

application_helper.rb で定義されたメソッドがあります。

def bayarea_cities
[
  ['San Francisco', 'San Francisco'],
  ['Berkeley', 'Berkeley'],
  ...
]
end

また、Grape を使用して API を作成しています。これは、Rails アプリの外部にある独自のモジュールにあります。

module FFREST
  class API_V2 < Grape::API
  ...

Grape は Rack アプリなので、Rails モジュールへの通常のアクセスはありません。API メソッドの 1 つで「bayarea_cities」メソッドを呼び出そうとすると、未定義の変数またはメソッド エラーが発生します。「include ApplicationHelper」で ApplicationHelper モジュールをインクルードしようとしましたが、うまくいきませんでした。

APIクラス内でこれにアクセスするにはどうすればよいですか?

アップデート:

Deefourさん、更新ありがとうございます。ヘルパー モジュールに追加extend selfし、メソッドを (モジュール メソッドではなく) インスタンス/ミックスイン メソッドとして参照しましたが、それでも同じエラーが発生します。私の lib/helpers.rb ファイルには次のものがあります。

module Helpers
  extend self

  def bayarea_cities
    [
      'San Francisco',
      'Berkeley', 
      'Danville', 
      'Oakland',
      'Daly City', 
      'Sunnyvale'
    ]
  end 

  def us_states
    ['CA']
  end
end

私のAPIファイルには次のものがあります:

module FFREST
  class API_V1 < Grape::API
    include Helpers
    version 'v1', :using => :header, :vendor => 'feedingforward'
    ...

もちろん、 config/initializers/helpers.rb ファイルがあります。require "helpers"

しかし、たとえば にアクセスして US states API メソッドを呼び出すと、次のhttp://localhost:5000/api/statesようになります。

undefined local variable or method `us_states' for #<Grape::Endpoint:0x007fd9d1ccf008>

何か案は?

4

1 に答える 1

3
  1. lib/helpers.rb次の内容のファイルを作成します。module Helpers; end
  2. bayarea_citiesメソッドをこのモジュール定義に移動します
  3. config/initializers/helpers.rbを含むファイルを追加します。require "helpers"
  4. クラス内にApplicationHelpers、追加しますinclude Helpers
  5. クラス内にAPI_V2追加しますinclude Helpers

Helpersこれで、Rails にモジュールをアプリケーション内で使用可能にするよう指示しbayarea_cities、Grape API クラスと Rails アプリの両方でメソッドとして使用できるようにしました。上記は要点を理解するための簡単な手順です。アプリケーションのどの部分からでも簡単にアクセスできる場所に、この共通機能を配置する必要があります。Helpersモジュールの名前空間を使用できます (使用する必要があります) 。


別のヒント:extend selfコメントで述べたように、すべてをクラスメソッドとして定義する必要を避けるためにモジュールに追加します

module Helpers
  extend self

  def bayarea_cities
    #...
  end
end

最後に、 を使用してモジュールを適切にインクルードしている場合は、 ではなくとしてメソッドに簡単にアクセスできるinclude Helpersはずです。そうでない場合は、発生したエラーを必ず表示してください。そうすれば、エラーを解決できます。bayarea_citiesHelpers.bayarea_cities

于 2013-03-20T01:29:28.123 に答える