Rails - 控制器助手应该去哪里?

时间:2016-04-03 21:11:28

标签: ruby-on-rails

以下是我的用例 -

我有一个控制器方法(操作),可以对Google进行API调用。我已经在Google文件夹中创建了一个类lib。类Google提供了api调用方法。

def self.list_items(folder_id, access_token)
    result = RestClient.get "#{API_URL}/drive/v2/files",
                            {
                                :Authorization => "Bearer #{access_token}",
                                :params => {:q => "'#{folder_id}' in parents and trashed=false"}
                            }
    return JSON.parse(result)['items']
  end

但是,我需要编写一个从list_items调用Google的方法,在access_token到期时捕获异常,刷新access_token,在数据库中保存新的access_token并进行list_items调用再次。

由于此方法需要与数据库进行交互,因此我不想将其放在lib的类中。我是rails的新手,我已经知道lib文件夹应该有第三方代码。这里的Google类可以被视为第三方类,因为它是一个PORO,与rails项目或我的业务逻辑没有任何关系。如果这种理解是错误的,请纠正我。

我可以将此方法保留为控制器中的私有方法,但假设有多种此类方法。不会让控制器发胖吗?

此外,控制器为FileApiController,而所有这些方法都是谷歌特定的。我也有特定于box和dropbox的方法。理想情况下,我想创建与{db}交互的GoogleHelperDropboxHelper等类。在哪里保留这个课程?

我来自Grails背景,而GoogleHelper通常会在Grails中作为服务制作,例如googleService。做轨道的方式是什么?具体来说,如果我做一个GoogleHelper课程,在哪里保留它?我猜,帮助文件夹只是为了保持视图助手。

1 个答案:

答案 0 :(得分:2)

app/helpers/google_helper.rb

中创建文件
module GoogleHelper

 class << self

  def print_hello
     puts 'HELLO WORLD'
  end      


  def list_items(folder_id, access_token)
    result = RestClient.get "#{API_URL}/drive/v2/files",
                            {
                                :Authorization => "Bearer #{access_token}",
                                :params => {:q => "'#{folder_id}' in parents and trashed=false"}
                            }
    return JSON.parse(result)['items']
  end
 end
end

如果您想在控制器中拨打GoogleHelper,请将其添加到application_controller.rb这个include GoogleHelper

现在,您可以在控制器中呼叫您的助手:GoogleHelper.print_hello