在Rails控制器中存储对象的最佳方式(会话除外)?

时间:2015-05-08 08:46:17

标签: ruby-on-rails ruby session controller

我有一个rails控制器

class Controllername < application
  def method1
    obj = API_CALL
    session =obj.access_token 
     redirect_to redirect_url    #calls the API authorization end point 
                            #and redirects to action method2  
  end
  def method2    
    obj.call_after_sometime
  end
end

我在方法1中调用一些API来获取对象并在会话中存储访问令牌和秘密。 method1完成了它的行动。

有一段时间我打电话给method2,现在会话(访问令牌,秘密)被正确存储。

但是,现在在method2内我需要使用OBJECT call_after_sometime调用API obj。但是,现在obj不可用,因为我没有存储它在一个会话中(我们将收到存储加密对象的SSL错误)。

我想知道在obj中存储method1的最佳方式是什么,以便稍后可以在method2中使用

编辑:

当我尝试Rails.cache或Session时,我收到错误

 TypeError - no _dump_data is defined for class OpenSSL::X509::Certificate

谷歌搜索我发现当我在会话中存储加密值时,它会抛出此错误。

2 个答案:

答案 0 :(得分:6)

您可以尝试缓存它,但要小心缓存键,如果对象是每个用户唯一的,那么在缓存键中添加用户ID

+files: FileBag {#221 ▼
    #parameters: array:1 [▼
      "attachment" => UploadedFile {#27 ▼
        -test: false
        -originalName: "test_doc.pdf"
        -mimeType: "application/pdf"
        -size: 82584
        -error: 0
      }
    ]
  }

如果您尝试阅读时可能不存在缓存,那么您可以使用["errors"]=> object(Illuminate\Support\ViewErrorBag)#178 (1) { ["bags":protected]=> array(1) { ["default"]=> object(Illuminate\Support\MessageBag)#179 (2) { ["messages":protected]=> array(1) { ["attachment"]=> array(1) { [0]=> string(59) "The attachment field is required when request type is sick." } } ["format":protected]=> string(8) ":message" } } } 代替class Controllername < application def method1 obj = API_CALL Rails.cache.write("some_api_namespace/#{current_user.id}", obj) session =obj.access_token end def method2 obj = Rails.cache.read("some_api_namespace/#{current_user.id}") obj.call_after_sometime end end ,如果它没有&#39则会调用api ;找到数据

fetch

more info here我也wrote about it here

答案 1 :(得分:1)

尝试这样做:将obj写入会话中的密钥并在第二种方法中再次读出。

class Controllername < application
  def method1
    obj = API_CALL
    session[:obj] = obj
  end
  def method2    
    if obj = session[:obj]
      obj.call_after_sometime
    end
  end
end