我遇到了访问方法的特定变量的问题,例如A,在另一个方法中说控制器中的B ..对象(变量)的大小太大,因为它包含服务调用的结果..我的用例就像从下拉框中选择一个选项,它重定向到控制器中的方法B,并且应该解析相同的对象(变量)。如何在其他方法中访问变量?
我尝试在cookie中存储,因为大小太大,我得到Cookie溢出异常。我没有使用DB。所以我猜使用memcache是行不通的。还尝试将其作为隐藏字段存储在视图中,并通过ajax调用将其值作为数据传递。但我把它作为一个字符串。试图将数据类型指定为json和其他几种方式......但没有用。使用@@ var也是din work ..不知道为什么..
代码:
关于更改下拉列表:
$(document).ready(function(){
$('#filter_service').change(function() {
$.ajax({type: "GET",
url: "/device_troubleshootings/query_operation",
data: { filter_service: $('# filter_service').val()},
});
});
});
服务电话:
def log_results
//Service call
@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
在这里,我试图在“/ device_troubleshootings / query_operation”方法中访问@dsn_result对象。
请建议我访问该变量的方法。
答案 0 :(得分:2)
<强> MVC 强>
我认为您对Rails 的工作方式感到困惑
请记住,Rails(它只是Ruby的一个框架)是基于"MVC" programming pattern构建的。这意味着每次您向Rails应用程序发送request
时,都必须由一个controller#action
处理,然后您可以从模型中提取相关数据
您遇到的问题是您尝试加载多个控制器方法,并将相同的数据传递给它们。这可能适用于Ruby,但不适用于Rails(Rails是无状态的):
-
<强>模型强>
处理此类设置的正确方法是为您的应用程序创建另一个请求,该请求将加载另一个controller#action
,允许您访问所需的数据
如上面的MVC图所示,每次向Rails发送请求时,它基本上都是新请求。这意味着,除非您将数据保存在Cookie中,否则您需要从模型中加载数据。
您遇到的问题是您尝试将整个数据集存储在系统的front-end
中。这个问题非常糟糕,因为它不仅效率低下,而且完全违背了MVC模式。
您可以更好地存储前端(id
或类似物)所需的极小数据集,然后您可以通过ajax将其发送到控制器;从
-
类变量
您提到您尝试声明某些@@class variables
无济于事。这个问题是类变量只能用于类的实例。
如上所述,由于Rails是无状态,因此类变量不会在请求之间持续存在(它们如何?)。考虑到您一直在尝试使用cookies
来存储数据,我想您已经知道了这一点
解决此问题的方法是每次从模型重建数据(如上所述)
您的解决方案是“无国籍”&#34;
以下是:
- 将
Method A
和Method B
视为完全独立的&#34;行动&#34;- 使用这些操作时,您需要考虑在两个
之间传递的最小数据- 要加载
醇>Method B
,您需要从浏览器发送新请求(就好像您之前从未加载Method A
一样)
您的method_a
可以在&#34;标准&#34;方式:
#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
如果您从自己的数据集中提取数据(使用模型),这将有效,但是,在您的情况下更好的方法可能是设置一个常量(当然,考虑到你没有&# 39;想要改变数据):
#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