我有一个应用程序,允许用户在不同的网站上跟踪歌曲。一个用户拥有_many:tracables和has_many:songs through:trackables。
:trackables表具有song_id、user_id和网站
在我的索引页面上,我呈现了所有@歌曲。每首歌有3个图标,每个图标都是一个ajax表单,点击后,会将其发布到trackables_controller,并根据点击的图标将其发布为"spotify"、"rdio"或"songza"。
如果用户以前从未点击过图标,则表单应张贴到:create。如果已经单击了图标,但再次单击,则表单应张贴到:delete。
我希望这是有道理的。我想我可以发布创建,检查是否存在相同的记录(如果存在,则删除)。我正在想办法解决这个问题。
我认为TrackablesController
中应该有三种形式都指向的toggle
动作(但有不同的song_id和网站参数)。创建/删除可跟踪的逻辑应该放在可跟踪模型中,如下所示:
class Trackable < ActiveRecord::Base
...
def self.toggle(user, song, website)
existing_trackable = where(user_id: user.id, song_id: song.id, website: website)
if existing_trackable.present?
existing_trackable.destroy_all
else
create(user_id: user.id, song_id: song.id, website: website)
end
end
end
它被称为这样:
class TrackableControllers < ApplicationController
def toggle
return render json: false unless user_signed_in?
song = Song.find(params[:song_id])
return render json: false unless song.present?
Trackable.toggle(current_user, song, params[:website])
render json: true
end
end
是的,它不是CRUD,但它仍然是REST:有一个资源(可跟踪)和一个操作(切换)。