は最も一般的には、content_tag
は、ビューのコンテキストで呼び出された - ビューがcontent_tag
に応答する方法を知っているのでそう、あなたはview.content_tag
を呼び出す必要はありません(単にcontent_tag
を呼び出すとself.content_tag
を呼び出すのと同じです)。
表示されているrender
メソッドは、Tag
から継承するクラスMetaTag
に存在します。 Tag
は普通のRubyオブジェクト(PORO)なので、content_tag
への返答方法はわかりません。
ご覧のとおり、render
メソッドは引数としてビューを受け取ります。そして、当然view
オブジェクトはcontent_tag
への応答方法を知っています。したがって、view.content_tag
を呼び出すことは、MetaTag
がコンテンツタグをレンダリングできる方法です。
これはPresenterパターンのインスタンスです(異なる人々は異なる用語を使用します)。 Ryan Batesはこのhereに良いRailsCastを持っています。
コメントの中で、Railsはview
がActionView::Base
のインスタンスであることを「知っていません」。あなたは実際のビューインスタンスを渡す責任があります。私はコントローラに渡して、ビューとパラメータにアクセスできるようにする傾向があります。たぶん、このような何か:method_missing
方法を含むことで
class FooController < ApplicationController
def foo_action
FooPresenter.present(self)
end
end
と...
class FooPresenter
class << self
def present(controller)
new(controller).present
end
end # class methods
#===================================================================
# instance methods
#===================================================================
def initialize(controller)
@controller = controller
end
def present
content_tag :div, data: {foo: params[:foo]}, class: 'bar'
end
private
def controller() @controller end
def view() controller.view_context end
def params() controller.params end
def method_missing(*args, &block)
view.send(*args, &block)
end
end
、私はもはやview.content_tag
を呼び出す必要がありません。私はcontent_tag
と呼ぶことができます。 FooPresenterはメソッドを見つけられないので、メソッドを見つけて実行するview
に呼び出しを送信します。
また、Ryanはこれをすべて説明する素晴らしい仕事をしています。
あなたの説明とそのRailsCastを私に指摘してくれてありがとう。私はまだ1つのことを理解していません.Railsは 'view'がRailsビューの' ActionView :: Base'ビューインスタンスであることをどのように知っていますか? – davideghz
あなたの更新された答えは素晴らしいですが、ActionView :: Baseインスタンスが実際にメソッドに渡される(宝石の)リンクされたソースコードの正確な行を教えてください。 – davideghz
うわー!あなたは本当に私をこの仕事のために働かせています...(冗談)。したがって、参照されている宝石を詳しく調べると、ドキュメンテーションに**コントローラでメタタグを使用する**と**表示でメタタグを使用する**というメッセージが表示されます。これはPOROプレゼンターのパターンに従わないことを示しています。代わりに、MetaTagのメソッドは 'metaContents :: Base'と' ActionView :: Base'の両方に 'meta-tags/lib/meta_tags.rb'の36行目と37行目で呼ばれるインクルードメソッドを介して含まれています。これらの文脈では、 'view'は常に利用可能です。 – jvillian