ruby inside javascript block [slim template]

后端 未结 3 801
青春惊慌失措
青春惊慌失措 2021-01-01 10:47

There is a way to put ruby conditions inside javascript block? i.e.

javascript:
  var config = {
      common_value_1 : 1, 
      common_value_2 : 2 
  };
           


        
3条回答
  •  梦谈多话
    2021-01-01 11:07

    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
      end
    end
    
    # in view file
    javascript: 
      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.ruby
    def configuration
      { foo: "Hello", bar: "World" }
    end
    
    def july_special
      { june_key: "It's June" }
    end
    
    def month_name
      Date.today.strftime("%B")
    end
    
    config = month_name == 'July' ? configuration.merge(july_special) : configuration
    
    content_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.

提交回复
热议问题