使用 Ajax/Javascript 增加 Rails 模型列

Posted

技术标签:

【中文标题】使用 Ajax/Javascript 增加 Rails 模型列【英文标题】:Increment Rails model column with Ajax/Javascript 【发布时间】:2015-09-06 17:01:43 【问题描述】:

我在 Rails 音乐应用程序中为 tracks 模型增加整数列 (plays) 时遇到问题。用户可以使用如下按钮在应用中播放曲目:

<% @top_tracks.each do |track| %>
  <button class="track-play track-<%= track.id %>-play" onclick="playTrack(<%= track.to_json %>)">
    <i class="icon-play"></i>
  </button>
  ...
  [info about the track, such as <%= track.title %>]
  ...
<% end %>

以下是相应javascript的相关部分:

var player = document.getElementById('audio');

window.playTrack = function (track) 
    player.setAttribute('src', track.file_url);
    player.play();
;

我已经阅读了一些类似问题的答案,例如 this one,这些问题建议使用 Ajax/Javascript,但我不确定如何做到这一点才能获得我想要的结果。我什至不知道 Ajax/Javascript 是否是实现我正在寻找的最佳方式。

应该发生的是,每次播放曲目并调用 playTrack() 函数时,该曲目的 plays 列的值应该增加 1,然后(显然)@987654328 的新值@ 应该保存在数据库中。

【问题讨论】:

【参考方案1】:

在您的每个曲目按钮中添加一个data attribute,例如data-track

<% @top_tracks.each do |track| %>
  <button data-track="#track.id" class="track-play track-<%= track.id %>-play" onclick="playTrack(<%= track.to_json %>)">
    <i class="icon-play"></i>
  </button>

<% end %>

在你的 routes.rb 中声明:

post '/update_track_info', as: 'update_track_info', to: 'tracks#update_track_info'

创建一个ajax请求:

window.playTrack = function (track) 
    player.setAttribute('src', track.file_url);
    player.play();
    $.ajax(
      url: '/update_track_info',
      data:  track_id: $(this).data('track').val() ,
      type: 'POST'
    ) 

;

然后在控制器动作上:

def update_track_info
 @track = Track.find(params[:track_id].to_i)
 @track.update_column(:plays, @track.plays.next)    
 render :nothing => true
end

【讨论】:

你能告诉我如何将ajax请求中的url连接到控制器中的方法吗? 我收到 400(错误请求)错误。看起来它无法识别 url 中的 rails 路径,因为与错误关联的 GET url 是:http://localhost:3000/%3C%=%20update_track_info_path()%20%%3E?track_id=14 你把控制器动作放在哪里了?应该写在tracks_controller.rb文件中。 控制器动作在tracks_controller.rb文件中。正如我上一条评论所指出的那样,ajax 传入的 url 似乎没有正确通过 get '/update_track_info', as: 'update_track_info', to: 'tracks#update_track_info'

以上是关于使用 Ajax/Javascript 增加 Rails 模型列的主要内容,如果未能解决你的问题,请参考以下文章

《浮筏 Floating Raft》入选 RAI 英国皇家人类学协会电影节.

通过(ajax/javascript)发布到 django 视图打印空查询集

使用 Ajax/Javascript/Django 的 CORS 请求

使用 ajax/Javascript 动态验证用户选择

Asp.net 使用 ajax (javascript) 从布局页面中的 api 控制器获取数据

Android SDK] 加载 SDK 时出错:Error: Error parsing C:\Users\Atul Rai\android-sdks\system-images\android-22