no_picture

ActionView 単体で slim を使ってみる

「ActionView を単体で使ってみる」というのを書いたので、ついでにいろいろ試してみる。その1。 誰が得するのか謎だけど ActionView だけで slim を使うことを試みてみました。 action_viewを require して、 action_pack を require して、 slim を require すれば使えます。 用意したファイル views/prefix/slim.html.slim p | Hello, #{@name} views/layout/appliacation.html.erb -- <%= yield %> -- require 'action_view' require 'action_pack' require 'slim' lookup_context = ActionView::LookupContext.new('./views') lookup_context.cache = false # ActionPachk を読まなくて済む魔法 view_context = ActionView::Base.new(lookup_context) view_context.assign(name: 'eiel') ret = view_context.render(template: 'slim', prefixes: 'prefix', puts ret =begin -- <p>Hello, eiel</p> -- =end slim は temple という gem を使ってRailsに対応してました。 ActionPack はバージョン確認に利用しているだけなので、ちょっといじればなんとかなりそうですけど。 Temple::Templates::Rails もう少し詳しく 誰得感がひどいのでもうちょっと書いてみる。 Railsとの連携の処理の部分は Temple::Templates::Rails(Slim::Engine, :register_as => :slim, # Use rails-specific generator.

no_picture

ActionView を単体で使ってみる

誰が興味があるのか謎ですが、ActionView を単体で使ってみようと思います。 意外にも Rails の仕組みとか見えてくるかもしれません。 Rails 4.1 ぐらいから ActionPack から独立した記憶があります。どうでしたっけ。 テンプレートを使いたい時には erb, haml, slim などを単体で利用すればいいのであまり使う機会はないかもしれません。 雑感では、 layout 機能を使いたい インスタンス変数で値にアクセスしたい Rails が提供するビューヘルパーを使いたい あたりがメリットかと思います。 この記事のために作成したコードはこちらにおいておきます。 補足の部分は読み飛ばせるように書いているつもりです。 利用したRailsのバージョンは 4.1.4 です。 1 Hello, world まずは使ってみます。 ActionView::Base.new.render(inline: 'Hello, World!') # => Hello, world ActionView::Base のインスタンスを作成し、renderメソッドを呼びだします。 コントローラでの render メソッドはどうやらこの render メソッドのようです。 (viewで使う render もこの render ですが…) 1の補足 ActionView::Base Rails を使ってる際に erb ファイルの中で self.class を確認したことはあるでしょうか? ちょっと確認してみましょう。 <%= self.class %> <%= self.class.superclass %> #<Class:0x007f82891092e0> ActionView::Base self は無名のクラスになっていますが、そのスーパークラスは ActiovView::Base です。 ビューは ActionView::Base のインスタンスのコンテキストで実行されるわけです。ビューコンテキストと呼んでいるようです。 また、このクラスにヘルパーをミックスインすることでヘルパーとして利用できるようになります。 デフォルトのHelperはすでに include されています。 > ActionView::Base.ancestors.map(&:to_s).grep(/Helper/) => ["ActionView::Helpers", "ActionView::Helpers::TranslationHelper", "ActionView::Helpers::RenderingHelper", "ActionView::Helpers::RecordTagHelper", "ActionView::Helpers::OutputSafetyHelper", "ActionView::Helpers::NumberHelper", "ActionView::Helpers::JavaScriptHelper", "ActionView::Helpers::FormOptionsHelper", "ActionView::Helpers::FormHelper", "ActionView::Helpers::FormTagHelper", "ActionView::Helpers::TextHelper", "ActionView::Helpers::DebugHelper", "ActionView::Helpers::DateHelper", "ActionView::Helpers::CsrfHelper", "ActionView::Helpers::ControllerHelper", "ActionView::Helpers::CacheHelper", "ActionView::Helpers::AtomFeedHelper", "ActionView::Helpers::AssetTagHelper", "ActionView::Helpers::AssetTagHelper::StylesheetTagHelpers", "ActionView::Helpers::AssetTagHelper::JavascriptTagHelpers", "ActionView::Helpers::SanitizeHelper", "ActionView::Helpers::ActiveModelHelper", "ActionView::Helpers::UrlHelper", "ActionView::Helpers::TagHelper", "ActionView::Helpers::CaptureHelper"] 2 インスタンス変数を使う Rails ではコントローラのインスタンス変数がビューの中で使えます。 普段はRailsが自動でやってくれていますが、自分でインスタンス変数を設定するには assign メソッドを使います。 view_context = ActionView::Base.new view_context.assign(name: 'eiel') view_context.render(inline: 'Hello, <%= @name %>') # => Hello, eiel @name が eiel に展開されています。 ActionView::Base のコンストラクタの第2引数に渡しても設定できます。 2の補足 ActionView::Rendering コントローラがビューコンテキストに対して assign メソッドを利用して、設定します。 これは ActionView::Rendering で行われます。 この ActionView::Rendering には ActionController::Base にミックスインされていて、コントローラがビューを設定する処理などが記述されているようです。 > ActionController::Base.ancestors.map(&:to_s).grep(/ActionView/) => ["ActionView::Layouts", "ActionView::Rendering", "ActionView::ViewPaths"] ActionController::Base には ActionView::Rendering がミックスインされています。 ちなみに assign するのに使う Hash は AbstractController::Rendering#view_assign で作成されています。 def view_assigns protected_vars = _protected_ivars variables = instance_variables variables.reject!