ruby inside javascript block [slim template] ruby inside javascript block [slim template] ruby ruby

ruby inside javascript block [slim template]


You can use a style similar to string interpolation. See example below.

javascript:  var config = {     custom: "#{my_value ? 'truthy' : 'falsy'}",    current_user: #{raw current_user.to_json}  };

** Update below **

If you want more advanced configuration I would recommend to create a class, for example

class ClientConfig  attr_accessor :foo, :bar  # .. code  def to_json    { foo: foo, bar: bar }.to_json  endend# in view filejavascript:   var config = ClientConfig.new.to_json

Else you also have the opportunity to create a ruby partial I've created an example below who may not be so beautiful but I works.

# template_path/_config.html.rubydef configuration  { foo: "Hello", bar: "World" }enddef july_special  { june_key: "It's June" }enddef month_name  Date.today.strftime("%B")endconfig = month_name == 'July' ? configuration.merge(july_special) : configurationcontent_tag :script, config.to_json.html_safe# viewfile= render 'template_path/config'

So my point is that there are multiple ways of doing this and you should try to find the way the one that suits you and your application the most. In my case, I would use my first example (before the update) if I just need one or two values else I would go for the class ClientConfig.


In pure Slim you don't have raw nor html_safe. In those cases, simply use double curly braces as documented here:

javascript:  var data = #{{ JSON.dump([{x: 1, y:2}]) }};


You have 2 options:

1. Use a ruby section

This scenario is better for complex code.

I have a ruby object that I want to make a JSON. So, inside my slim file I'll create a ruby section:

ruby:  myObject = @object.to_json.html_safe

Pay attention to html_safe: it's important to not escape double quotes.

Then you can use myObject inside javascript section:

javascript:  var data = #{myObject};

2. Use double curly braces

For simple cases, use the double curly braces inside the javascript section, like stated in @fphilipe answer:

javascript:  var data = #{{@object.to_json}};