Ruby methods within Javascript within HAML

前端 未结 2 397
别跟我提以往
别跟我提以往 2020-12-23 17:30

I have a jQuery script that adds a new field to a form, and this field contains dynamic information from an array. The problem is that I can\'t figure out how to add an arra

相关标签:
2条回答
  • 2020-12-23 17:37

    Try this, it should work (all i did was remove a single space in the fifth line and add the closing quote on the sixth):

    %script(type="text/javascript")
      $('#mylink').click(function() {
      $('#mylink').after('<select>
      - @myarray.each do |options|
        <option value="#{options.id}">#{options.name}</option>
      </select>');
      )};
    

    However, assuming you're running this with a ruby script or framework of sorts, why not just do it outside the template? That would probably be most appropriate. In rails/sinatra and other frameworks, you could use a helper method to do this. If you look at the haml reference, they actually discourage use of - to evaluate ruby.

    0 讨论(0)
  • 2020-12-23 17:56

    Usually, if something is a pain in haml, it means you should refactor the the tricky bit to a helper or partial and call that.

    // some_helper.rb
    def new_snazzy_select_tag(options = [])
      select_tag 'tag_name_here', options.map { |option| [option.id, option.name] }
    end
    

    Also, you should use the :javascript filter to render javascript since it will put it in a script tag for you and allow indentation.

    Lastly, you can use #{ruby_expression} anywhere in haml, including :javascript filters, which is very handy when you need to output the result of ruby expressions to places that are not directly contents of html elements.

    // some_view.html.haml
    :javascript
      $('#mylink').click(function() {  
        $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}");
      };
    
    0 讨论(0)
提交回复
热议问题