gpt4 book ai didi

ruby-on-rails - 在 ruby​​ on Rails 中访问另一种方法的变量

转载 作者:行者123 更新时间:2023-12-02 21:25:01 25 4
gpt4 key购买 nike

我在访问 Controller 中的方法(例如 A )的特定变量(例如 B )时遇到问题。对象(变量)的大小太大,因为它包含所做的服务调用的结果..我的用例就像从下拉框中选择一个选项,它重定向到 Controller 中的方法 B,并且应该解析相同的对象(变量)。如何访问其他方法中的变量?

我尝试存储在 cookie 中,由于大小太大,我收到 Cookie 溢出异常。我没有使用数据库。所以我想使用memcache是​​行不通的。还尝试将其存储为 View 中的隐藏字段,并通过 ajax 调用将其值作为数据传递。但我把它当作一个字符串。尝试将数据类型指定为 json 和其他几种方法..但没有用..使用 @@var 也不起作用..不知道为什么..

代码:

更改下拉列表:

$(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对象。

请建议我访问该变量的方法。

最佳答案

MVC

我认为您对 Rails 应该如何工作感到困惑

请记住,Rails(只是 Ruby 的一个框架)构建于 "MVC" programming pattern 之上。这意味着每次您向 Rails 应用程序发送请求时,它都必须由单个controller#action处理,然后您将允许您从中提取相关数据你的模型

您遇到的问题是您尝试加载多个 Controller 方法,并将相同的数据传递给这两个方法。这可能适用于 Ruby,但不适用于 Rails(Rails 是无状态的):

enter image description here

--

型号

处理此类设置的正确方法是为您的应用程序创建另一个请求,该请求将加载另一个controller#action,从而允许您访问您的数据需要

如上面的 MVC 图所示,每次向 Rails 发送请求时,它基本上都是一个请求。这意味着除非您以 cookie 之类的方式保存数据,否则您需要从模型加载数据。

您遇到的问题是您试图将整个数据集存储在系统的前端中。这个问题非常糟糕,不仅效率低下,而且完全违背了MVC模式。

您可以更好地在前端存储所需的最低限度数据集(id或类似的),然后您可以通过ajax将其发送到 Controller ;构建一个新的数据集

--

类变量

您提到您尝试声明一些@@class 变量但无济于事。这样做的问题是类变量只能用于类的实例

如上所述,由于 Rails 是无状态的,因此类变量不会在请求之间持续存在(它们怎么可能?)。考虑到您一直在尝试使用 cookie 来存储您的数据,我想您已经知道这一点

解决这个问题的方法是每次从模型中重建数据(如上所述)


解决方案

您的解决方案是“无国籍”

方法如下:

  1. Treat Method A and Method B as completely separate "ACTIONS"
  2. When using these actions, you need to consider the smallest piece of data to pass between the two
  3. To load Method B, you need to send a new request from your browser (as if you've never loaded Method A before)

您的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

关于ruby-on-rails - 在 ruby​​ on Rails 中访问另一种方法的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25073993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com