【问题标题】:rails invoking methods controller vs model轨道调用方法控制器与模型
【发布时间】:2016-04-04 01:22:58
【问题描述】:

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

这是我不知道如何/在哪里放入我的应用程序的两种方法。我的问题(我有 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

把这个方法放在哪里?应该是类/实例?应该如何调用?

  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

【问题讨论】:

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


    【解决方案1】:

    您问了一个很好的问题,根据我的经验,Rails 社区没有一个普遍采用的约定来放置代码,以便对第三方服务进行服务器端 API 调用。

    当您的应用以可以异步的方式使用外部 API 时,可以直接使用 ActiveJobsidekiq 之类的 gem 调用这些调用。这是一篇不错的文章(参见标有“与外部 API 对话”的部分):https://blog.codeship.com/how-to-use-rails-active-job/

    但是,如果您正在构建一个真正依赖于 3rd-party API 的应用程序并且异步调用不会给您带来太多好处,那么我建议您定义一种不同类型的类,它既不是模型、视图也不是控制器.当还没有 gem 来满足您的需求时,一个常见的做法是为保存在 lib 文件夹下的 API 编写一个 ruby​​ 包装类。将模型方法的范围保持在需要数据库交互性的逻辑范围内。从控制器调用模型方法以及包装类中定义的 Web 服务方法。

    祝你好运!

    【讨论】:

    • 肖恩,谢谢!你能把第二版的好文章也发给我吗?对于此功能,我需要这种方法(尽管我将使用 sidekiq 进行电子邮件通知)。
    • 当然。这个是几年前的,但在遵循惯例方面做得很好,而且描述性很强:code.tutsplus.com/articles/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多