销毁没有ID的对象

时间:2016-11-28 14:21:43

标签: ruby-on-rails ruby ruby-on-rails-4

我正在为我的rails应用程序创建LIKE模型。路由是:

resources :bonuses, only: %i(index create) do
  resources :likes, only: %i(create destroy)
end

我做了类似的创作,现在试图制作一个不喜欢的按钮。 我想删除像这个按钮一样:

= link_to "Dislike", bonus_like_path, method: :delete

但我在这里得到错误:缺少必需的密钥:[:bonus_id,:id] 如果我通过bonus_like_path(奖金)我会错过ID参数(但我不需要他,我知道user.id)

要删除我需要知道的所有内容 bonus_id current_user.id

schema.rb (赞)

create_table "likes", force: :cascade do |t|
  t.integer "user_id",  null: false
  t.integer "bonus_id", null: false
  t.index ["user_id", "bonus_id"], name: "index_likes_on_user_id_and_bonus_id", unique: true, using: :btree
end

协会很简单:

奖金

has_many :likes, dependent: :destroy
has_many :liked_users, through: :likes, source: :user

用户:

has_many :likes, dependent: :destroy
has_many :liked_bonus, through: :likes, source: :bonus

像:

belongs_to :bonus, counter_cache: true, touch: true
belongs_to :user

所以我理解我可以发出DELETE bonus_like_path(bonus)请求,因为用户已在current_user中定义。但不知道如何正确写它。

3 个答案:

答案 0 :(得分:1)

在这种情况下,您可以在奖励控制器上放置unlike方法。它不是RESTful,但由于你没有首先传递类似ID,奖励ID似乎是你需要的id和正确的行动地点。

def unlike
  bonus = Bonus.find(params[:id])
  bonus.likes.where(:user_id => current_user).destroy_all
  # render or redirect
end

和路线

resources :bonuses, only: %i(index create) do
  put :unlike, on: :member
  resources :likes, only: %i(create)
end

如果你这样做,也可以移动like方法并删除路线中喜欢的资源。

答案 1 :(得分:0)

仅仅因为你传递id params并不意味着你必须使用那些特定的参数。在您的视图中,您可以这样做:

link_to "Dislike", bonus_like_path(bonus, like.id), method: :delete

并在您的控制器中:

current_user.likes.where(bonus_id: params[:bonus_id]).destroy_all

或者你需要做什么来摧毁那个对象。重点是,就像你说的那样,你的控制器中有current_user

仅仅因为你传入奖励ID并且喜欢id,并不意味着你必须专门针对这些参数行事。

答案 2 :(得分:0)

如果我理解正确的话,你会试图捎带现有的资源路径助手,以获得删除你喜欢的BUT的链接而不发送由Resourceful路由生成的like id。我不知道为什么你没有像使用类似REST那样的REST(没有双关语),但是没有找到忽略类似id参数的方法,如何设置一个只需要的路径奖金ID?

resources :bonuses, only: [:index :create] do
  resources :likes, on: [:create]
  delete 'delete_like', on: :member
end

有了这个,你应该有一个/bonuses/1/delete_like路由,以及一个delete_like_bonus_path帮助器,它将获得奖励ID为:bonus_id参数(用耙路线检查)。路线指南here中的更多信息。在轨道3.2上进行了测试。