2015-05-13 2 views
1

Im Newby, так что, может быть, его очень глупо qustion) У меня есть контроллер:Почему объект становится null? (Rails4)

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-вызовов init с использованием ajax. И я получаю ответ, что @uid имеет значение null. В журналах - в 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> 

Что плохого в коде? Спасибо!

+0

вы не отправляете данные в запросе Ajax и вы ожидаете данные в Params переменного? – ppascualv

+0

Я не уверен, что вы пытаетесь сделать. Но ответ, вероятно, связан с тем, что каждый запрос обрабатывается другим экземпляром класса контроллера. Таким образом, переменные экземпляра не разделяются между запросами. – jphager2

+0

@ jphager2 Я думаю, что я понял, что мне нужно правильно. Хорошо, я спрошу иначе. Когда пользователь впервые посещает мою страницу - я получаю (iav get :)) набор параметров, в следующий раз - я должен уже использовать эти параметры. Как я могу их сохранить (конечно, песоном для каждого пользователя), без сеансов? – AlexB82

ответ

0

Веб-запросы, веб-серверы, сеть в целом, не имеют гражданства. Поэтому, когда вы установили @uid = params[:user_id] в свой метод idx, он действителен для жизни этого запроса/ответа, но следующий запрос обрабатывается новым экземпляром вашего контроллера, а в этом новом экземпляре @uid не был установлен.

Способ, которым мы подделываем состояние в мире Интернета, использует файлы cookie, cookie отправляется обратно в браузер при первом посещении, и браузер автоматически отправляет этот файл cookie обратно на веб-сервер с каждым запросом. Мы можем поместить любую информацию, которую мы хотим, в этот файл cookie в первом запросе, и браузер отправит это обратно нам с последующими запросами - так что мы сможем подделать состояние.

Rails добавляет еще один уровень безопасности поверх куки, называемых сеансами, что позволяет нам безопасно хранить информацию в файле cookie, а затем безопасно извлекать его в последующих запросах.

Таким образом, измените ваш @uid=params[:user_id] к session[:uid] = @uid = params[:user_id] в методе idx, а затем в app_init сделать первую строку: @uid = session[:uid]

Смежные вопросы