我有一个应用程序,允许用户跟踪不同网站上的歌曲。用户has_many:trackables和has_many:歌曲:trackables。
:trackables表有song_id,user_id和网站
在我的索引页面上,我渲染所有@songs。每首歌都有3个图标,每个图标都是一个ajax形式,点击后会发布到trackables_controller,网址为“spotify”,“rdio”或“songza”,具体取决于点击的图标。
如果用户从不点击之前的图标,则表单应发布到:create。如果已单击该图标,但再次单击该图标,则表单应发布到:delete。
我希望这是有道理的。我想我可以发布创建,检查是否存在相同的记录(如果是,则删除)。我试图找出Railsy的方法来做到这一点。
答案 0 :(得分:1)
我认为toggle
中应该有TrackablesController
个动作,所有三种形式都指向(但有不同的song_id和网站参数)。创建/删除可跟踪的逻辑应该放在模型Trackable中,如下所示:
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:有一个资源(Trackable),还有一个动作(切换)。