{"id":2121,"date":"2012-05-21T14:00:01","date_gmt":"2012-05-21T11:00:01","guid":{"rendered":"http:\/\/blog.railsware.com\/?p=2121"},"modified":"2021-08-16T15:55:33","modified_gmt":"2021-08-16T12:55:33","slug":"shared-handlebars-templates-for-rails-3","status":"publish","type":"post","link":"https:\/\/railsware.com\/blog\/shared-handlebars-templates-for-rails-3\/","title":{"rendered":"Shared Handlebars Templates for Rails 3"},"content":{"rendered":"\n<p>Hello my dear friends. Today we will talk about the way, how we share handlebars templates in Rails 3. In the <a href=\"https:\/\/railsware.com\/blog\/shared-mustache-templates-for-rails-3\/\" target=\"_blank\" rel=\"noreferrer noopener\">previous article<\/a> I explained you how we share mustache templates between rails backend and javascript frontend in our <a href=\"https:\/\/railsware.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">company<\/a>. After article publication, many people turned to the question &#8220;What about handlebars templates?&#8221;. With a little of efforts, we have created an alternative gem for shared templates &#8211; SHT_rails (Shared Handlebars Templates for Rails).<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">How it works?<\/h2>\n\n\n\n<p>First of all you have to add this gem to your Gemfile and start &#8216;bundle install&#8217;:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">gem 'sht_rails', git: 'git:\/\/github.com\/railsware\/sht_rails.git'\n<\/pre>\n\n\n\n<p>Next launch generator:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rails g sht_rails:install\n<\/pre>\n\n\n\n<p>That&#8217;s all.<\/p>\n\n\n\n<p>Now you can create a directory in &#8216;app\/templates&#8217; handlebars templates (these templates ends with &#8216;.handlebars&#8217; by default). Let&#8217;s create partial for the product:<\/p>\n\n\n\n<p>File: &#8216;app\/templates\/products\/_product.handlebars<\/p>\n\n\n\n<p>Content:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;a href=\"{{url}}\">{{title}}&lt;\/a>\n&lt;p>{{description}}&lt;\/p>\n<\/pre>\n\n\n\n<p>You can render this partial in ActiveView:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;%= render \"products\/product\", :handlebars => product.as_json %> \n<\/pre>\n\n\n\n<p>And in JavaScript:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var product = \u2026 ; come from ajax call as json\nvar content = SHT['products\/product'](product);\n<\/pre>\n\n\n\n<p>If you want use handlebars partials, here example in ActiveView:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;%= render \"products\/product\", :handlebars => product.as_json, :partials => {:partial_key => (render \"products\/partial\")} %>\n<\/pre>\n\n\n\n<p>And in Javascript:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Handlebars.registerPartial('partial_key', SHT['products\/partial'])\ncontent = SHT['products\/product'](product)\n<\/pre>\n\n\n\n<p>So in the end you&#8217;ll have only one template, which is shared between Rails and JavaScript. The gem has one disadvantage (in my humble opinion) &#8211; it installed on the backend &#8220;therubyracer&#8221; gem, which compile templates on backend. Basically this gem is used to precompile assets in rails and doesn&#8217;t require on production.<\/p>\n\n\n\n<p>Source code: <a href=\"https:\/\/github.com\/le0pard\/st_rails_example\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/le0pard\/st_rails_example<\/a><\/p>\n\n\n\n<p>That&#8217;s all folks!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Links<\/h2>\n\n\n\n<p>Rubygems: <a href=\"https:\/\/rubygems.org\/gems\/sht_rails\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/rubygems.org\/gems\/sht_rails<\/a><\/p>\n\n\n\n<p>Source code: <a href=\"https:\/\/github.com\/railsware\/sht_rails\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/railsware\/sht_rails<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello my dear friends. Today we will talk about the way, how we share handlebars templates in Rails 3. In the previous article I explained you how we share mustache templates between rails backend and javascript frontend in our company. After article publication, many people turned to the question &#8220;What about handlebars templates?&#8221;. With a&#8230;<\/p>\n","protected":false},"author":17,"featured_media":2129,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3],"tags":[],"coauthors":["Alexey Vasiliev"],"class_list":["post-2121","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"acf":[],"aioseo_notices":[],"categories_data":[{"name":"Engineering","link":"https:\/\/railsware.com\/blog?category=development"}],"post_thumbnails":"https:\/\/railsware.com\/blog\/wp-content\/themes\/railsware\/vendors\/images\/article-thumbnail-default.jpg","amp_enabled":true,"_links":{"self":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/2121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/comments?post=2121"}],"version-history":[{"count":32,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/2121\/revisions"}],"predecessor-version":[{"id":14158,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/2121\/revisions\/14158"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/media\/2129"}],"wp:attachment":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/media?parent=2121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/categories?post=2121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/tags?post=2121"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/coauthors?post=2121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}