2016-11-28 73 views
0

我創造一個像模型到我的Rails應用程序。路由是:銷燬對象,而它的ID

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_idcurrent_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

只是因爲你通過ID PARAMS中並不意味着你必須使用這些特定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傳遞,並不意味着你必須專門作用於這些PARAMS。

0

如果我理解正確的話你要捎帶上現有的足智多謀的路徑助手獲得一個鏈接刪除您喜歡,但不發送它是由足智多謀的路線產生類似的ID。我不知道你爲什麼不使用像id這樣的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上測試它。

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方法過也並刪除喜歡的資源路線。