56

私の Rails アプリには、次のようなコントローラーがあります。

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

私の見解では、これを簡単に行うことができます:

<%= @blog_post.title %>

魔法苦手です。これはどのように達成されますか?

4

2 に答える 2

91

ビューがレンダリングされると、インスタンス変数とその値がコントローラから取得され、ビュー インスタンスに設定されるビュー初期化子に渡されます。これは、次の Ruby メソッドを使用して行われます。

instance_variables- インスタンス変数の名前を取得する (ドキュメント) instance_variable_get(variable_name)- インスタンス変数の値を取得する (ドキュメント) instance_variable_set(variable_name, variable_value)- インスタンス変数の値を設定する (ドキュメント)

Railsコードは次のとおりです。

コントローラー インスタンス変数の収集 ( 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
于 2013-09-17T17:07:48.340 に答える
-3

decent_exposure gem は、Rails の標準コントローラー インスタンス変数の動作に代わるものですreadme には、この問題に関する適切な記述があります。

于 2015-05-06T05:00:23.050 に答える