我正在为我的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
中定义。但不知道如何正确写它。
答案 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上进行了测试。