使用AJAX/Javascript创建Rails对象

Create Rails object with AJAX/Javascript

本文关键字:Rails 对象 创建 Javascript AJAX 使用      更新时间:2023-09-26

在Rails音乐应用程序中,我试图通过创建一个play对象来计算艺术家的曲目,当访问者访问该网站时播放曲目。每个play都有自己唯一的ID,并属于一个轨道。

目前,我在API的plays_controller.rb文件中设置了创建功能。但是,我在将它连接到页面上的播放按钮时遇到了问题,因此播放曲目实际上会创建一个属于该特定曲目的新播放对象。

用户可以使用以下按钮在应用程序中播放曲目:

<% @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 %>

以下是routes.rb文件的相关部分,用于显示plays_controller.rb在API中的位置:

namespace :api, defaults: {format: 'json'} do
  namespace :v1 do
    resources :plays, only: [:index, :create]
  end
end

以下是plays_controller.rb文件的相关部分:

def create
  @play = Play.create!(play_params)
  render(:json => {}, :status => :created)
end
private
def play_params
  params.require(:play).permit(:track_id)
end

下面是相应Javascript的相关部分:

var player = document.getElementById('audio');
window.playTrack = function (track) {
    player.setAttribute('src', track.file_url);
    player.play();
    var trackId = track.id;
};

我不知道如何使用AJAX来正确创建一个新的播放对象。我已经尝试将此添加到上面的Javascript中的playTrack函数:

$.ajax({
  type: "POST",
  url: '/api/v1/plays',
  data: { track_id: trackId }
})

但它不起作用,给了我错误信息"param未找到:play"(这似乎是从plays_controller.rb创建操作中的play_params抛出的)。

如果有任何帮助,我将不胜感激。

Rails期望参数是嵌套的,例如play的track_id应该命名为play[track_id]。您可以通过在AJAX数据中包含一个play对象来解决这个问题,如下所示:

$.ajax({
  type: "POST",
  url: '/api/v1/plays',
  data: { play: { track_id: trackId } }
})