Доступ к переменной сеанса или переменной контроллера из модуля - PullRequest
3 голосов
/ 22 октября 2011

Использование: Rails 3.0.3

У меня есть эта особенность моего сайта (count count. Com), которая состоит из множества различных вычислений. Пользователь может установить свою собственную переменную для десятичных (значащих чисел) через форму. Сначала я установил эту переменную как переменную configatron, что оказалось плохой идеей (изменение, которое сделал какой-то пользователь, было передано всем пользователям).

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

Теперь в контроллере я вызываю функцию модуля, которая в свою очередь вызывает 100 различных функций модуля, в зависимости от идентификатора.

Моя проблема:

Я хочу получить доступ к этой переменной сеанса в этом модуле, что оказывается невозможным. Передача его уже из контроллера (через модель) - это настоящий кошмар, потому что его нужно передавать для каждой функции.

Итак:

  1. Как получить доступ к переменным сеанса из модуля в каталоге lib?
  2. Как я могу получить доступ к методу контроллера из модуля? Если это так, я мог бы вызвать этот метод и получить переменную сеанса.

Ответы [ 3 ]

3 голосов
/ 22 октября 2011

Вы имеете в виду модуль ruby? Как в миксине? Если вы включаете его в свой контроллер, он уже имеет доступ ко всему, к чему у контроллера есть доступ. Просто позвоните session, request, params и т. Д., И все будет работать.

Если вам действительно нужно получить сеанс из какой-либо произвольной части системы, вы можете получить запрос с помощью:

ActionDispatch::Request.new(ENV)

Тогда вы можете получить сеанс из запроса. (Обратите внимание, что запрос на самом деле является замаскированным синглтоном ... он не будет создавать новый запрос, если он уже создан).

1 голос
/ 23 октября 2011

звучит так, будто ваша модель включает код модуля. Вы действительно не хотите использовать или получать доступ к сеансу напрямую оттуда. Это нарушает цель MVC, Rails делает все возможное, чтобы помешать вам попробовать что-то подобное.

когда вы говорите: «Я вызываю функцию модуля, которая в свою очередь вызывает 100 различных функций модуля, в зависимости от идентификатора». Я хотел бы увидеть этот кусок кода.

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

Трудно давать рекомендации, не видя код. Я застрял в аналогичной ситуации и использовал динамические методы (переопределение method_missing), чтобы обойти проблему.

1 голос
/ 22 октября 2011

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

# 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, который вы можете затем смешать в модуле расчета с теми, если необходимо, они, вероятно, не получат значение из сеанса

Что еще нужно учесть, просто сохраните пользовательское значение в базе данных вместо сеанса, у вас будет легкий доступ к значению из модели или контроллера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...