Rails:单按钮布尔形式 - 确定是否发布到:创建或:删除

时间:2015-12-08 00:32:16

标签: ruby-on-rails ajax

我有一个应用程序,允许用户跟踪不同网站上的歌曲。用户has_many:trackables和has_many:歌曲:trackables。

:trackables表有song_id,user_id和网站

在我的索引页面上,我渲染所有@songs。每首歌都有3个图标,每个图标都是一个ajax形式,点击后会发布到trackables_controller,网址为“spotify”,“rdio”或“songza”,具体取决于点击的图标。

如果用户从不点击之前的图标,则表单应发布到:create。如果已单击该图标,但再次单击该图标,则表单应发布到:delete。

我希望这是有道理的。我想我可以发布创建,检查是否存在相同的记录(如果是,则删除)。我试图找出Railsy的方法来做到这一点。

1 个答案:

答案 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),还有一个动作(切换)。