在Grape中使用Rails ApplicationHelper

时间:2013-03-20 01:12:01

标签: ruby-on-rails ruby-on-rails-3 api module grape-api

我有一个在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模块,并将方法引用为instance / mixin方法(而不是模块方法),但我仍然遇到相同的错误。在我的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>

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

  1. 使用以下内容创建一些lib/helpers.rb文件:module Helpers; end
  2. bayarea_cities方法移至此模块定义
  3. 添加包含config/initializers/helpers.rb
  4. require "helpers"文件
  5. ApplicationHelpers课程内,添加include Helpers
  6. API_V2班级内添加include Helpers
  7. 您现在已经告诉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访问该方法。如果不是这种情况,你绝对应该表明你得到的错误,以便我们为你排序。