Rails:如何将数据从Ruby传递到Javascript

时间:2014-03-29 01:10:41

标签: javascript jquery ruby-on-rails ruby

我正在使用Rails 4.在我的一个控制器中,我使用HTTParty进行调用以从last_fm API获取数据 - 用户指定一个城市,然后我构建了一个html页面,以便即将举行的音乐会的详细信息在该城市中显示(标题,日期,艺术家等)。

我的应用的下一个目标是使用Google Maps API映射这些音乐会。我已设法在页面上加载地图,并将“city”参数(由用户的搜索指定)作为地图自动居中的位置。

由于我通过Ruby HTTP方法获取了Last_fm数据,因此我不得不通过使用jQuery选择器从html页面中获取数据来将其传递给Javascript map API代码。本质上,为了从Ruby传递任何数据(包括用户通过表单和last_fm API请求/响应提交的参数),我需要将该代码放在html('view')中,然后使用jQuery来获取数据到javascript。我使用这种方法很好,但是当我尝试编写一个函数来将更复杂的代码从Ruby传递给Javascript时,我遇到了障碍。

这是我被困的地方: 我的javascript文件中有一行=:console.log($("div.music_id")); 我也试过console.log($("div.music_id").contents()); 两者都只是打印到控制台[object Object]。 我不确定为什么会这样。我在页面上有很多div.music_id元素,我需要遍历它们以便从子DOM节点捕获信息。我无法迭代它们,因为jQuery似乎没有像我希望的那样捕获元素。我希望它会生成一个对象数组,然后我可以执行进一步的jQuery选择器方法来优化我的选择,但我无法做到这一点。谢谢你的帮助。顺便说一下,我的“视图”中的代码就在这里(注意它嵌入了ruby):

<h1>Show data for city specified on previous page</h1>
  <% @events.each do |x| %>
  <div class="music_id" id=<%= x["id"] %>>
    <div class="venue">
      <h3>Event Venue:</h3>
      <p><%= x["venue"]["name"] %></p>
    </div>
    <div class="time">
      <h3>Date & Time:</h3>
      <p> <%= x["startDate"] %></p>
    </div>
    <div class="event_title">
      <h3>Title:</h3>
      <p> <%= x["title"] %></p>
    </div>
    <div class="artists_playing">
      <h3>Artists playing:</h3>
      <% array = Array(x["artists"]["artist"]) %>
      <% array.each do |y| %>
        <%= array.index(y) + 1 %>)
        <%= y %>
        <br>
      <% end %>
    </div>
    <hr> 
  </div>
<% end %>

和@events引用控制器中的代码(Ruby代码):

@event_list = self.class.get('http://ws.audioscrobbler.com/2.0/',:query =&gt; {

:method => 'geo.getEvents',
:location => params[:city],
:format => 'json',
:api_key => 'xxxxxxyyyyyyzzzzz'})
@events = @event_list["events"]["event"]

这个Ruby代码继承了HTTParty的方法,我需要在控制器的顶部。视图代码显示数据正常,因此问题是我无法将其移动到Javascript文件。

我希望得到一些建议,如果有更好的方法将信息从Ruby传递给Javascript,或者我应该怎么做。感谢

2 个答案:

答案 0 :(得分:3)

我认为您的问题是您应该将json与数组一起使用。尝试使用array.to_jsonHow can I use JavaScript to parse Ruby JSON string

一旦转换为json,它应该是可迭代的。

答案 1 :(得分:3)

尝试使用gon gem。 Ryan bates展示了如何使用它并提供了将ruby对象传递给javascript的其他选项:

http://railscasts.com/episodes/324-passing-data-to-javascript

顺便问一下,您是否尝试使用inspect元素来确保插入元素的ID是正确的?