Creating JavaScript in Sinatra Helpers

I use Haml as a template language in a Sinatra-based web application, and I'm having trouble creating a JavaScript array based on information from a database model. Essentially, I'm trying to create a JavaScript array consisting of usernames for use in jQuery-UI autocomplete widgets.

I tried the following code but it did not work.

:javascript
  var names = new Array;
  - User.all.each do |u|
    names.push(#{u})

After reading, most people suggest doing something that involves evacuating Ruby (i.e., something with a “-” prefix in Haml) instead of an assistant. So, considering this, can someone explain to me how to generate JavaScript in a helper method?

+3
source share
2 answers

, haml (, :javascript). ruby, - #{} Ruby.

, - - :

:javascript
  var names = new Array;
  #{js = ""
  User.all.each {|u| js << "names.push(#{u})\n" }
  js}

, - . - , ( haml) , .

javascript, javascript - , . :

def js_array(name, array)
  js = "var #{name} = new Array();\n"
  array.each do |i|
    js << "#{name}.push(#{i})\n"
  end
  js
end

( javascript:

def js_array(name, array)
  js = "var #{name} = ["
  js << array.collect{|i| "\"#{i}\""}.join(",")
  js << "]"
  js
end

.)

, ? Sinatra , 'helpers. , , :

helpers do
  def js_array(name, array)
    js = "var #{name} = new Array();\n"
    array.each do |i|
      js << "#{name}.push(#{i})\n"
    end
    js
  end
end

:javascript
  #{js_array("names", User.all)}

haml javascript. , #{}, ruby ​​ , . :javascript <script> <![CDATA[, javascript, .

: User.all, activerecord - , , , . - :

:javascript
  #{js_array("names", User.all.collect(&:pretty_name)}

( pretty_name - User, ), , , , .

+4

, - JavaScript, , , , , jQuery UI .

, :

helpers do
  # Return an array of users' names
  def get_all_names
    return User.all.map {|u| u.name}
  end
end

Haml:

:javascript
  $(function() {
    var names = #{get_all_names.to_json};
    $("#widget").autocomplete({ source: names });
  }); 
+2

All Articles