Вот один из способов сделать это, смешать модуль вычислений с контроллером
# application_controller contains a method that wraps your session value
class ApplicationController < ActionController::Base
protect_from_forgery
def user_value
return 5 # really a session value
end
end
Модулю, содержащему ваши методы расчета, необходим доступ к сеансу, поскольку, смешивая его с контроллером, вы можете вызвать метод user_value с помощью self
module CalculationModule
def super_cool_calculation
return self.user_value * 420
end
# more calculation methods
end
обратите внимание на вызов self.user_value, этот метод не определен в модуле, но вам нужно определить его в классе, который вы смешиваете с
class FooController < ApplicationController
include CalculationModule
def show
@calculation = super_cool_calculation # call calculation module method
end
# etc...
если какой-либо из ваших объектов модели также определит метод user_value, который вы можете затем смешать в модуле расчета с теми, если необходимо, они, вероятно, не получат значение из сеанса
Что еще нужно учесть, просто сохраните пользовательское значение в базе данных вместо сеанса, у вас будет легкий доступ к значению из модели или контроллера