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 方法中调用“bayarea_cities”方法时,我收到未定义的变量或方法错误。我尝试将 ApplicationHelper 模块包含在“include ApplicationHelper”中,但这不起作用。

如何在 API 类中访问它?

更新:

感谢Deefour的更新。我添加extend self到我的 Helpers 模块中,并将这些方法引用为实例/混合方法(而不是模块方法),但我仍然遇到同样的错误。在我的 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"

但是,当我调用美国各州 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

您现在已经告诉 Rails 使该Helpers模块在您的应用程序中可用,并bayarea_cities在您的 Grape API 类和 Rails 应用程序中作为方法可用。上面的步骤只是为了理解这一点——你需要把这个通用功能放在一个可以被应用程序的任何部分轻松访问的地方。您可以(并且应该)使用命名空间您的Helpers模块。


另一个提示:添加extend self到模块以避免需要将所有内容定义为您在评论中提到的类方法

module Helpers
  extend self

  def bayarea_cities
    #...
  end
end

最后,如果您正确地包含模块include Helpers,您应该能够简单地访问该方法bayarea_cities,而不是Helpers.bayarea_cities。如果不是这种情况,您绝对应该显示您收到的错误,以便我们为您解决。

于 2013-03-20T01:29:28.123 回答