복붙노트

[RUBY-ON-RAILS] 레일에 루비 - 모델에서 액세스 컨트롤러 변수

RUBY-ON-RAILS

레일에 루비 - 모델에서 액세스 컨트롤러 변수

나는 모델의 컨트롤러에 설정되어있는 인스턴스 변수에 접근하려합니다. 컨트롤러는 제품의 컨트롤러와 모델은 제품 모델입니다. 인스턴스 변수는 다른 모델이라는 계정의 인스턴스입니다.

인스턴스 변수는 @current_account입니다

내가 코드 아무 일도 발생하지 않습니다 실행하면 오류가 발생합니다하지 않습니다. 내가 모델에서 컨트롤러에 설정 액세스 인스턴스 변수에 대해 뭔가 읽기를 찾을 수있는 사람을 알고합니까?

감사

EEF

해결법

  1. ==============================

    1.당신은 일반적으로 내가 들어갈하지 않을 것이다 고 생각을 가진 문제에 대한 모델에서 컨트롤러에 액세스하려고해서는 안된다.

    당신은 일반적으로 내가 들어갈하지 않을 것이다 고 생각을 가진 문제에 대한 모델에서 컨트롤러에 액세스하려고해서는 안된다.

    그래서 같은 유사한 문제를 해결 :

    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
    

    그럼 그냥 Account.current와 현재의 계정에 액세스

  2. ==============================

    2.면책 조항 : 말했다 다음 코드 휴식 MVC 규칙, ...

    면책 조항 : 말했다 다음 코드 휴식 MVC 규칙, ...

    클래스 속성을 사용하면 아마도 안전 문제를 스레드로 이어질 수 있습니다. 나는 스레드 수준에서 저장 컨트롤러 관련 데이터에 Thread.current +의 around_filter를 사용하고 삭제됩니다 보장 할 다만 요청 완료되기 전에 :

    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
    

    [: 제어기 이제 전류 제어기 인스턴스 Thread.current 통해 요청을 처리하는 동안 사용할 전역 것

  3. ==============================

    3.이 모델에서 컨트롤러 변수에 액세스해야하는 경우는 일반적으로 컨트롤러는 모델에서 정보를 얻을 수, 컨트롤러가 (레일 적어도)보기와 모델 사이의 다리 역할을하기 때문에 설계가 잘못 의미 모델은 컨트롤러에 대해 아무것도 몰라한다 어쨌든 그것을 수행하려는 경우 그러나 당신은 jeem 말한대로 그것을 할 수 있지만, 차라리 할 거라고 :

    이 모델에서 컨트롤러 변수에 액세스해야하는 경우는 일반적으로 컨트롤러는 모델에서 정보를 얻을 수, 컨트롤러가 (레일 적어도)보기와 모델 사이의 다리 역할을하기 때문에 설계가 잘못 의미 모델은 컨트롤러에 대해 아무것도 몰라한다 어쨌든 그것을 수행하려는 경우 그러나 당신은 jeem 말한대로 그것을 할 수 있지만, 차라리 할 거라고 :

     class << self
    
        attr_accessor :current
    
     end
    

    대신 cattr_accessor의 : 현재

    예상대로 당신이 왜 여기에 볼 수 => cattr_accessor이 작동하지 않습니다

  4. ==============================

    4.내가 여기에 게시합니다 그래서 내가 직접 언급 할 수 : 허용 대답 잘 될 것 같지 않습니다. @vise 노트로, 클래스 변수는 요청에서 공유됩니다. 단지 하나의 경상 전체 앱이 아니라면 예상대로 그래서,이 동작하지 않습니다.

    내가 여기에 게시합니다 그래서 내가 직접 언급 할 수 : 허용 대답 잘 될 것 같지 않습니다. @vise 노트로, 클래스 변수는 요청에서 공유됩니다. 단지 하나의 경상 전체 앱이 아니라면 예상대로 그래서,이 동작하지 않습니다.

    자세한 내용은 여기 @molf에 의해 허용 대답을 참조하십시오 IS 레일 - 아무것도 공유하거나 요청이 동일한 런타임 변수에 액세스 분리 할 수 ​​있습니까?

  5. ==============================

    5.내가 정확하게 질문을 이해 있는지 확실하지 않습니다,하지만 난 자상 할게요.

    내가 정확하게 질문을 이해 있는지 확실하지 않습니다,하지만 난 자상 할게요.

    나는 당신이 모델에서 컨트롤러 인스턴스 변수에 액세스해야하는 경우 다음 중 하나를 필요 그것을 모델의 속성을 만들거나 다른 클래스 컨트롤러가 아닌 모델로 논리를 이동 생각합니다.

  6. from https://stackoverflow.com/questions/2419120/ruby-on-rails-access-controller-variable-from-model by cc-by-sa and MIT license