【问题标题】:how to create an action controller helper class and how to access that in controller action?如何创建动作控制器帮助程序类以及如何在控制器动作中访问它?
【发布时间】:2014-12-04 11:42:29
【问题描述】:

大家好,新手问题。

我正在创建一个 Rails 应用程序,在向用户显示结果后,我需要在后台执行一些其他操作来更新数据库。

(对不起,我不善于解释,请参阅我的示例代码了解情况)

在我的控制器操作中,我使用第三方 api 从远程服务器获取数据。 在向用户显示获取的数据后,我想使用获取数据的自定义数据更新数据库表。

class MyController < ApplicationController
 def SomeAction
  #some logic
  @result = FetchDataFromApi#Using third party api to fetch huge data 
  #show result to user
  #after showing i need to do following operations elsewhere (controller helper)
  #based on some fetched result i want to update my table
  myId = @result.id
  dataObj = MyModel.find(myId)
  info = @result.information.gsub(',',' ') #some string operation
  dataObj.update_attributes(:info, info)
 end
end

在向用户显示结果后,我可以使用spawnling gem 执行额外的操作。但我只是好奇我是否可以使用助手或其他导轨的东西来做到这一点。

【问题讨论】:

  • 如果您需要在后台运行任何东西,您需要使用 sidekiq 或类似工具。
  • @BroiSatse actioncontroller helper 有副作用吗?
  • ActionCONtroller 助手是控制器和视图之间的桥梁,除非您有其他想法。响应始终作为请求生命周期的最后一步发送,因此任何非后台代码都需要在发送响应之前完成执行。您可以尝试使用线程,但事实证明这些会导致更多问题。 Sidekiq 是我在所有项目中使用的解决方案,它似乎做得很好。
  • 我会的,产卵怎么样?

标签: ruby-on-rails ruby helpers


【解决方案1】:

虽然在某些情况下使用后台处理是有意义的。这不是其中之一。

我假设“向用户显示结果”是指根据从 api 获取的数据呈现一些模板。

实际上,将访问外部 API 转移到后台可能是个好主意,但这需要更改流程。至于更新 db 记录,将其移至后台通常不是一个好主意。

话虽如此,我不会在控制器中进行更新,我会将其移动到模型或“突变”类中:

class Model
  def self.update_from_api
    res = API.fetch ...
    object = find res.id
    object.update_from_api! res
    res
  end

  def update_from_api(api_data)
    update_attributes! info: api_data.gsub(....)
  end
end

【讨论】:

  • 感谢您的建议。我会尝试你的建议并让你知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多