Как изменить сессию в модели? - PullRequest
0 голосов
/ 12 марта 2012

Я использую Rails 3. Я очень подробно кодировал контроллер. Итак, я пытаюсь рефакторинг контроллера.

Я кодировал класс ProductMaker, который создает продукт и модифицирует сеанс (задача продукта для формы мастера - current_step, если запрос является обновлением и т. Д.)

В этом классе есть метод, который получает сеанс в качестве параметра, изменяет и затем возвращает этот новый сеанс.

Действие контроллера:

  def new
    #INITIALIZE CODE
    session[:refresh] ||= SortedArray.new [1]
    #...MORE CODE
  end

    def create
     #...MUCH CODE
     unless Utilities.is_refresh(session[:refresh])
        #...more code
        session = ProductMaker.some_method_which_return_session(session) #KEY PROBLEM LINE
        #...more code
     end
     #... MORE CODE
    end

Мой класс ProductMaker в папке lib:

class ProductMaker

def self.some_method_which_return_session(session)
 session[:any_key] = "some value"
 return session
end

end

Однако когда я пишу КЛЮЧЕВУЮ ЛИНИЮ ПРОБЛЕМЫ, сессия имеет нулевое значение. Если я прокомментирую эту строку, то сессия будет ActionDispatch :: Session :: AbstractStore :: SessionHash.

В чем может быть проблема? Как я могу реорганизовать логику контроллера, которая модифицирует многие ключи сеанса и «заполняет» модель в зависимости от значений сеанса, до модели / класса?

UPDATE:

Я читаю о связывании в ruby.

Как можно изменить сеанс, используя привязки и метод eval?

Если у вас есть другие идеи, пожалуйста, оставьте свой ответ.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Вы присваиваете session = в «строке проблемы ключа». Это создает локальную переменную для метода create, которая затеняет метод session на ActionController::Base. Локальная переменная nil перед назначением (не несуществующая!), Поэтому конечный результат - session == nil для всего метода, который, очевидно, нарушает все. Итак: не присваивайте session. Назовите возвращаемое значение как-нибудь еще.

0 голосов
/ 23 апреля 2012

Я использую технику переплета.Поэтому я передаю контекст (имитирующий переменные передачи параметров передачи).

Пример

class OwnController

класс SettingManager def self.modify (сеанс, привязка) eval "# {session} .any_value = 5" привязка eval "# {сеанс} .other_value = 'значение' ', конец привязки конец

0 голосов
/ 13 марта 2012

Наконец я использую привязки.

Например:

class SessionManager

self.update(session, binding)
 eval "#{session} = 0", binding
end

end

class SomeController < ApplicationController

def foo_action_1
  session[:refresh] = 1
end

def example_ajax_modify_session
   a = session[:refresh] == 1 #true
   SessionManager.update("session[:refresh]", binding)
   b = session[:refresh] == 1 #false
   a == b #false because a == 1 and b == 0
end

Мне пришлось изменить и управлять многими значениями сеанса, прежде чем у меня был очень подробный контроллер. Теперь я могу рефакторинг этой логики для модели.

...