MVC
我认为您对 Rails 应该如何工作感到困惑
请记住,Rails(它只是一个 Ruby 框架)是基于 "MVC" programming pattern 构建的。这意味着每次您向 Rails 应用程序发送 request 时,都必须由单个 controller#action 处理,然后您将允许您从模型中提取相关数据
您遇到的问题是您尝试加载多个控制器方法,并将相同的数据传递给两者。这可能适用于 Ruby,但不适用于 Rails(Rails 是无状态的):
--
型号
处理此类设置的正确方法是为您的应用程序创建另一个请求,该请求将加载另一个controller#action,允许您访问所需的数据
如上面的 MVC 图所示,每次向 Rails 发送请求时,基本上都是一个新请求。这意味着除非您将数据保存在 cookie 中,否则您需要从模型中加载数据。
您遇到的问题是您试图将整个数据集存储在系统的front-end 中。这个问题非常糟糕,不仅效率低下,而且完全违背了 MVC 模式。
您最好将所需的最小数据集存储在前端(ids 或类似的),然后您可以通过 ajax 将其发送到您的控制器;从
构建一个新的数据集
--
类变量
你提到你试图声明一些@@class variables 无济于事。这样做的问题是类变量只能用于类的实例。
如前所述,由于 Rails 无状态,类变量不会在请求之间持续存在(它们怎么会?)。考虑到您一直在尝试使用 cookies 来存储您的数据,我想您已经知道这一点
解决这个问题的方法是每次从模型中重建数据(如上所述)
解决方案
你的解决方案是“去无状态”
方法如下:
- 将
Method A 和Method B 视为完全独立的“操作”
- 使用这些操作时,您需要考虑在两者之间传递的最小数据段
- 要加载
Method B,您需要从浏览器发送一个新请求(就像您以前从未加载过Method A一样)
您的method_a 可以以“标准”方式处理:
#config/routes.rb
resources :your_controller do
collection do
get :method_a
get :method_b
end
end
这意味着您可以相对简单地加载method_a:
#app/controllers/your_controller.rb
Class YourController < ApplicationController
def method_a
@get_log_results = LogQueryService.client.get_logs(Com::Amazon::Logqueryservice::DeviceSerialNumberQuery.new(:search_text => @ search , :index => 'dms', :index_type => '_all', :from_time_stamp => @from_time_stamp, :to_time_stamp => @to_time_stamp))
@dsn_result = @get_log_results.logs_result_obj_list
end
end
如您所知,@dsn_result 不会持续到下一个请求。
有两种方法可以解决此问题(设置 CONSTANT -- 如果您从 API 中提取,这将为您提供一次调用 -- 或使用 before_action 为尽可能多的操作设置变量根据需要)。我会为你详细说明:
#app/controllers/your_controller.rb
Class YourController < ApplicationController
before_action :set_log_data
def method_a
end
def method_b
end
private
def set_log_data
@get_log_results = LogQueryService.client.get_logs(Com::Amazon::Logqueryservice::DeviceSerialNumberQuery.new(:search_text => @ search , :index => 'dms', :index_type => '_all', :from_time_stamp => @from_time_stamp, :to_time_stamp => @to_time_stamp))
@dsn_result = @get_log_results.logs_result_obj_list
end
end
如果您从自己的数据集中提取数据(使用模型),这将起作用,但是,在您的情况下,更好的方法可能是设置一个常量(当然,考虑到您不这样做)不希望数据改变):
#config/initializers/dsn_result.rb
get_log_results = LogQueryService.client.get_logs(Com::Amazon::Logqueryservice::DeviceSerialNumberQuery.new(:search_text => @ search , :index => 'dms', :index_type => '_all', :from_time_stamp => @from_time_stamp, :to_time_stamp => @to_time_stamp))
DSN_RESULT = get_log_results.logs_result_obj_list