Ruby on Rails - Access controller variable from model

后端 未结 5 956
深忆病人
深忆病人 2020-11-30 06:12

I am trying to access an instance variable which is set in the controller in the model. The controller is the products controller and the model is the products model. The in

相关标签:
5条回答
  • 2020-11-30 06:22

    DISCLAIMER: The following code breaks MVC conventions, that said...

    Using class attributes can probably lead to thread safety issues. I would use Thread.current + around_filter to store controller related data at thread level, and ensure it gets cleared just before the request finishes:

    class ApplicationController < ActionController::Base
    
      around_filter :wrap_with_hack
    
      def wrap_with_hack
        # We could do this (greener solution): 
        # http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/
        # ... but for simplicity sake:
        Thread.current[:controller] = self
        begin
          yield
        ensure
         # Prevent cross request access if thread is reused later
         Thread.current[:controller] = nil
        end
      end
    end
    

    Now the current controller instance will be avaliable globaly during the request processing through Thread.current[:controller]

    0 讨论(0)
  • 2020-11-30 06:23

    You shouldn't generally try to access the controller from the model for high-minded issues I won't go into.

    I solved a similar problem like so:

    class Account < ActiveRecord::Base
      cattr_accessor :current
    end
    
    class ApplicationController < ActionController::Base
      before_filter :set_current_account
      def set_current_account
        #  set @current_account from session data here
        Account.current = @current_account
      end
    end
    

    Then just access the current account with Account.current

    0 讨论(0)
  • 2020-11-30 06:29

    I'm not sure if I understand the question exactly, but I'll take a stab.

    I think if you need to access a controller instance variable from the model then you either need to make it an attribute in the model, or move your logic to the other class controller, not model.

    0 讨论(0)
  • 2020-11-30 06:34

    If you need to access a controller variable from a model it generally means your design is wrong because a controller serves as bridge between view and model (at least in Rails), controller gets info from models, models shouldn't know anything about controllers, but if you want to do it anyway you can do it just as jeem said, but I'd rather do:

     class << self
    
        attr_accessor :current
    
     end
    

    instead of

    cattr_accessor :current

    you can see why here => cattr_accessor doesn't work as it should

    0 讨论(0)
  • 2020-11-30 06:42

    I can't comment directly so I'll post here: the accepted answer does not seem to be right. As @vise notes, class variables are shared across requests. So unless there's just one current account for the entire app, this won't behave as expected.

    For more, see the accepted answer by @molf here: Is Rails shared-nothing or can separate requests access the same runtime variables?

    0 讨论(0)
提交回复
热议问题