Skip to content

Latest commit

 

History

History
83 lines (60 loc) · 2.18 KB

README.md

File metadata and controls

83 lines (60 loc) · 2.18 KB

Rails Hydration

Pass data from Ruby to Javascript without writing JS in your .erb view files.

Gem Version Code Climate

The Problem

When trying to pass data from Ruby to Javascript we end up doing something like:

<!-- app/views/posts/show.html.erb -->
<h1><%= @post_title %></h1>

<script>
  var postMeta = <%= @post_meta.to_json  %>
</script>

This works, but requires us to write our Javascript inline in .erb views (yuk).

Getting Started

Add the gem to your Gemfile:

# Gemfile
source 'https://rubygems.org'

gem 'rails_hydration'

Add the javascript to application.js — above other JS files that you want to use the helper in:

// app/assets/javascripts/application.js
//
//= require rails_hydration
//= require_tree .

In your views, pass Ruby data that you want to use in your Javascript via the hydration helper, giving it a unique key ("postMeta" in the example below):

# app/controllers/posts_controller.rb
class PostsController < ApplicationController

  def show
    @post_title = "My Post Title"
    @post_meta = {
      author: 'Jason',
      date: Date.parse("2014-10-12"),
      published: true
    }
  end

end
<!-- app/views/posts/show.html.erb -->
<h1><%= @post_title %></h1>

<%= hydration('postMeta', @post_meta) %>

In your Javascript, use the Hydration.onReady function the same way you would use jQuery's $(document).on('ready'). Your hydration data will be passed to your callback as the first argument:

// app/assets/javascripts/posts.js

Hydration.onReady(function(data){
  console.log('Post meta:', data.postMeta);
  //  {
  //    author: 'Jason',
  //    date: '2014-10-12',
  //    published: true
  //  }
});

You can add as many hydration tags to the page as you'd like, provided they each have a unique key ("postMeta" in the example above). As for the value, feel free to pass in strings, booleans, arrays, hashes, ActiveRecord objects, etc. The helper calls .to_json internally.