在轨道上的ruby中访问另一个方法的变量

时间:2014-08-01 06:18:09

标签: ruby-on-rails ruby ruby-on-rails-3 variables cookies

我遇到了访问方法的特定变量的问题,例如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对象。

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

1 个答案:

答案 0 :(得分:2)

<强> MVC

我认为您对Rails 的工作方式感到困惑

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

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

enter image description here

-

<强>模型

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

如上面的MVC图所示,每次向Rails发送请求时,它基本上都是请求。这意味着,除非您将数据保存在Cookie中,否则您需要从模型中加载数据。

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

您可以更好地存储前端(id或类似物)所需的极小数据集,然后您可以通过ajax将其发送到控制器;从

构建新的数据集

-

类变量

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

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

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


解决方案

您的解决方案是“无国籍”&#34;

以下是:

  
      
  1. Method AMethod B视为完全独立的&#34;行动&#34;
  2.   
  3. 使用这些操作时,您需要考虑在两个
  4. 之间传递的最小数据   
  5. 要加载Method B,您需要从浏览器发送新请求(就好像您之前从未加载Method A一样)
  6.   

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