为什么对象变为空? (Rails4)

时间:2015-05-13 13:31:53

标签: ruby-on-rails ruby ajax ruby-on-rails-4

我是一个新人,所以也许这是一个非常愚蠢的问题 我有一个控制器:

 class MainPageController < ApplicationController

  def uid=(xid)
   @uid=xid
  end  

  def idx
  response.headers.delete('X-Frame-Options')
  @uid=params[:user_id]
  log=Logger.new(STDOUT)
  log.debug("UID #{@uid}")
  log.debug("#{params[:access_token]}")
  app=VK::Application.new(app_id: 4914826, app_secret: 'ZjeOFuApRPVdvL234Tsu', version: '5.31', access_token: params[:access_token])

  end

  def queue_req

  end

  def app_init
   #vkjson=app.friends.getOnline uid
   response.headers.delete('X-Frame-Options')
   log=Logger.new(STDOUT)
   log.debug("UID FO JSON #{@uid}")
   render json: {'uid'=>@uid}.to_json

  end
end

idx - 由默认路由调用。默认视图 - 初始化一些js后 - 使用ajax调用init。我得到一个答案,@uid为空。在日志中 - 在idx中 - @uid - 是coorect,在init中 - 已经是null。为什么呢?

这是页面代码的一部分

    <script type="text/javascript">
VK.init(function() {

 $.ajax({
    url: 'http://localhost:3000/init', // JSON_URL is a global variable
    dataType: 'json',
    error: function(xhr_data) {
      alert ('Error')

    },
    success: function(xhr_data) {
      alert(xhr_data.uid)
    },
    contentType: 'application/json'
  });

});
</script>

代码有什么问题? 谢谢!

1 个答案:

答案 0 :(得分:0)

Web请求,Web服务器,Web一般都是无状态的。因此,当您在@uid = params[:user_id]方法中设置idx时,它在该请求/响应的生命周期内有效,但下一个请求由您的控制器的新实例处理,并在该新实例中{{ 1}}尚未设置。

我们在网络世界中伪造状态的方式是使用cookie,在第一次访问时将cookie发送回浏览器,浏览器会在每次请求时自动将该cookie发送回Web服务器。我们可以在第一个请求中将我们想要的任何信息放入该cookie中,浏览器会将这些信息发回给我们并随后发出请求 - 这样我们就可以伪造有状态。

Rails在名为sessions的cookie之上添加了另一个安全层,允许我们在cookie中安全地存储信息,然后在后续请求中安全地检索它。

因此,在@uid方法中将@uid=params[:user_id]更改为session[:uid] = @uid = params[:user_id],然后在idx中填写第一行:app_init

相关问题