我有一个在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>
有什么想法吗?
答案 0 :(得分:3)
lib/helpers.rb
文件:module Helpers; end
bayarea_cities
方法移至此模块定义config/initializers/helpers.rb
require "helpers"
文件
ApplicationHelpers
课程内,添加include Helpers
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
访问该方法。如果不是这种情况,你绝对应该表明你得到的错误,以便我们为你排序。