rails调用方法控制器与模型

时间:2015-12-30 05:08:58

标签: ruby-on-rails class methods instance-variables separation-of-concerns

我有一个rails应用程序。我试图微调不同的模型和控制器。我可以让事情奏效,但我不确定我是否采取了首选方式。所以我有一个event.rb用于我自己的应用内全日历,我可以在其中进行CRUD新事件并使用social.rb进行omniauth授权(在这种情况下是谷歌日历)。我试图在我的fullcalendar中显示gcal事件,因此基于social.rb数据(令牌,密钥),我向谷歌进行API调用以获取gcal事件时间,然后在事件/索引页面中显示数据(fullcalendar)。

以下是我的两种方法,我不知道如何/在哪里放入我的应用程序。我的问题(我有3个,因为它们紧密相连):

  • 方法类型。我看到init_google_api_calendar_client应该是一个类方法,如果我把它放入social.rb(我甚至不确定我是否应该把它放在那里)。对于get_busy_events,我根本无法确定要使用的类型。
  • 我想我应该把这些方法放在模型/模块中,但是哪一个(社交/事件/其他)?
  • 我应该如何调用这些方法?

events_controller

  def index
    @user = current_user
    @google = @user.socials.where(provider: "google_oauth2").first
    @client = Social.init_google_api_calendar_client(@google) ### Is this the proper way to call this method?
    @get_busy_times = #####how to call the get_buys_events method?
    @event = Event.new
    @events = Event.allevents(current_user)
    respond_to do |format|
      format.html
      format.json { render json: @events }
      format.js
    end
  end

social.rb

  def self.init_google_api_calendar_client(google_account)
    #method only called if google_oauth2 social exists
    client = Google::APIClient.new
    client.authorization.access_token = google_account.token
    client.authorization.client_id = ENV['GOOGLE_API_KEY']
    client.authorization.client_secret = ENV['GOOGLE_API_SECRET']
    client.authorization.refresh_token = google_account.refresh_token
    return client
  end

这个方法放在哪里?应该是class / instance?应该如何调用?

  def get_busy_events(client)
    service = client.discovered_api('calendar', 'v3')
    result = client.execute(
      api_method: service.freebusy.query,
      body_object: { timeMin: start_at,
                     timeMax: end_at,
                     items: items},
      headers: {'Content-Type' => 'application/json'})
  end

1 个答案:

答案 0 :(得分:2)

您提出了一个很好的问题,根据我的经验,Rails社区中没有一个普遍采用的约定,即在哪里放置代码,使服务器端API调用第三方服务。

当您的应用以可以异步的方式使用外部API时,最好使用sidekiq或直接使用lib之类的宝石来调用这些调用。这是一篇不错的文章(请参阅“与外部API交谈”一节):https://blog.codeship.com/how-to-use-rails-active-job/

但是,如果您正在构建一个真正依赖于第三方API的应用程序并且异步调用没有为您提供太多好处,那么我建议定义一个既不是模型,视图也不是控制器的不同类型的类。当没有宝石满足您的需求时,通常的做法是为保存在re.findall文件夹下的API编写一个ruby包装类。将模型方法限定为需要数据库交互性的逻辑。从控制器调用模型方法以及在包装器类中定义的Web服务方法。

祝你好运!