복붙노트

[RUBY-ON-RAILS] 어떻게 레일 인스턴스 변수는 뷰에 전달된다?

RUBY-ON-RAILS

어떻게 레일 인스턴스 변수는 뷰에 전달된다?

내 레일 응용 프로그램에서,이 같은 컨트롤러가 :

class MyController < ApplicationController
  def show
    @blog_post = BlogPost.find params[:id]
  end
end

내 관점에서 간단히 말해서 나는이 작업을 수행 할 수 있습니다

<%= @blog_post.title %>

나는 마법 불편 해요. 이것은 어떻게 달성?

해결법

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

    1.뷰가 렌더링 될 때, 인스턴스 변수와 그 값은 컨트롤러로부터 픽업하고보기 인스턴스로 설정 뷰 이니셜로 전달된다. 이 이러한 루비 방법을 사용하여 수행됩니다 :

    뷰가 렌더링 될 때, 인스턴스 변수와 그 값은 컨트롤러로부터 픽업하고보기 인스턴스로 설정 뷰 이니셜로 전달된다. 이 이러한 루비 방법을 사용하여 수행됩니다 :

    instance_variables - 인스턴스 변수의 이름 (문서)를 얻는다 instance_variable_get (VARIABLE_NAME는) - 인스턴스 변수의 값을 가져옵니다 (문서) instance_variable_set (VARIABLE_NAME, VARIABLE_VALUE) - 인스턴스 변수의 설정 값 (문서)

    여기에 레일 코드는 다음과 같습니다

    수집 제어기 인스턴스 변수 (GitHub의)

    def view_assigns
      hash = {}
      variables  = instance_variables
      variables -= protected_instance_variables
      variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
      variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) }
      hash
    end
    

    뷰 (GitHub의)에 전달 :

    def view_context
      view_context_class.new(view_renderer, view_assigns, self)
    end
    

    뷰 (GitHub의)에서 그들을 설정 :

    def assign(new_assigns) # :nodoc:
      @_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) }
    end
    
  2. ==============================

    2.decent_exposure 보석은 레일 '의 표준 컨트롤러 인스턴스 변수의 행동에 대한 대안입니다. 추가 정보는 문제에 대한 좋은 작성자가 있습니다.

    decent_exposure 보석은 레일 '의 표준 컨트롤러 인스턴스 변수의 행동에 대한 대안입니다. 추가 정보는 문제에 대한 좋은 작성자가 있습니다.

  3. from https://stackoverflow.com/questions/18855178/how-are-rails-instance-variables-passed-to-views by cc-by-sa and MIT license