【问题标题】:Rails - Where should controller helpers go?Rails - 控制器助手应该去哪里?
【发布时间】:2016-07-23 07:42:37
【问题描述】:

以下是我的用例 -

我有一个向 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

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

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

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

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

我来自 Grails 背景,GoogleHelper 通常会作为 Grails 中的服务(如 googleService)。 rails 的做法是什么。具体来说,如果我创建了一个GoogleHelper 课程,那么该放在哪里?我猜,helper 文件夹只是用来保存视图助手的。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    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

    【讨论】:

    • 您可以删除 list_items 中的代码,因为我将在此处调用 Google.list_items。您的解决方案似乎不错,但我认为 helpers 文件夹下的类主要用于查看助手。将控制器助手保存在 helpers 文件夹下是一种常见的做法吗?
    • 是的,这是一种很好的做法,将助手用于控制器和视图。
    • 另外,您也可以在 MODEL 文件中调用 Helpers GoogleHelper.print_hello
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多