Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails控制器中存储对象的最佳方式(会话除外)?_Ruby On Rails_Ruby_Session_Controller - Fatal编程技术网

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

Ruby on rails 在Rails控制器中存储对象的最佳方式(会话除外)?,ruby-on-rails,ruby,session,controller,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

我有一个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

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

您可以尝试缓存它,但要小心缓存密钥,如果每个用户的对象都是唯一的,则在缓存密钥中添加用户id

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

我也试着这样做:在会话中将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
class Controllername<应用程序
定义方法1
obj=API\u调用
会话[:obj]=obj
结束
定义方法2
如果obj=会话[:obj]
找个时间给你打个电话
结束
结束
结束

使用实例变量
@obj
我试过了。在
method2
中,如果控制器类在两次调用期间都保持加载状态,那么为什么不尝试
类变量
。我对类变量的用法不太熟悉。我应该初始化到什么值。您不应该设置
session=
。将会话视为可以存储值的散列,例如,你可以说
session[:foo]=“bar”
。这不起作用,因为obj包含加密对象,它抛出SSL错误只需写入访问令牌即可,或者您需要执行的任何操作“某个时间后调用”我需要整个对象,而不仅仅是访问令牌。在随后的调用中,method2上变量obj(实例或类)的值变为null,我需要它与method2中的值相同。你有什么解决办法吗?请原谅我的耽搁。但是,当我尝试的时候。它得到了与使用会话相同的错误(SSL错误)您能否将该错误添加到问题中,还有
obj.class
了解该对象的类别object@Rocky29您使用的是什么api?我使用的是第三方api,在从method1重定向期间,它会将一些授权值发送到method2,并在稍后使用obj.call_和我需要的授权值进行未来的api调用。我的问题是,一旦obj到达Method2,它就会变为零。由于某种原因,对象可能无法序列化。您应该找到可以保存的最小数据量,以便执行后续请求,而不是将对象作为一个整体保存,例如,此访问令牌是否足够?
def method2
  obj = Rails.cache.fetch("some_api_namespace/#{current_user.id}") do
    method_1
  end
  obj.call_after_sometime
end
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