私の Rails アプリには、次のようなコントローラーがあります。
class MyController < ApplicationController
def show
@blog_post = BlogPost.find params[:id]
end
end
私の見解では、これを簡単に行うことができます:
<%= @blog_post.title %>
魔法苦手です。これはどのように達成されますか?
私の Rails アプリには、次のようなコントローラーがあります。
class MyController < ApplicationController
def show
@blog_post = BlogPost.find params[:id]
end
end
私の見解では、これを簡単に行うことができます:
<%= @blog_post.title %>
魔法苦手です。これはどのように達成されますか?
ビューがレンダリングされると、インスタンス変数とその値がコントローラから取得され、ビュー インスタンスに設定されるビュー初期化子に渡されます。これは、次の 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
decent_exposure gem は、Rails の標準コントローラー インスタンス変数の動作に代わるものです。readme には、この問題に関する適切な記述があります。