2016-11-28 3 views
0

Я создаю модель LIKE для моего приложения 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,: идентификатор] Если я прохожу 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 

Ассоциации просты:

Bonus:

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 

Так что я понимаю, что я могу сделать УДАЛИТЬ bonus_like_path(bonus) запрос, потому что пользователь уже определен в current_user. Но не знаю, как правильно писать.

ответ

0

Просто потому, что вы передаете id params in, это не значит, что вам нужно использовать эти параметры. По вашему мнению вы можете сделать:

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

и в контроллере:

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

или все, что нужно сделать, чтобы уничтожить этот объект. Дело в том, что, как вы сказали, у вас есть current_user в вашем контроллере.

Просто потому, что вы передаете идентификатор бонуса и, как идентификатор, не означает, что вам нужно действовать именно по этим параметрам.

0

Если я правильно понял, вы пытаетесь связать с существующими помощниками пути находчивого пути, чтобы получить ссылку, чтобы удалить понравившуюся вас, но не отправив идентификатор, который генерируется маршрутом «Находчивый». Я не знаю, почему вы не используете REST-подобный (не каламбур), как id, но вместо того, чтобы искать способ игнорировать параметр 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 помощника, который получит бонус в качестве идентификатор :bonus_id параметра (Проверьте реки маршруты).Дополнительная информация в руководстве по маршрутизации here. Протестировано на рельсах 3.2.

1

В этом случае вы можете поставить метод unlike на бонусный контроллер. Это не RESTful, но поскольку вы не передаете одинаковый идентификатор, в первую очередь, бонусный идентификатор, по-видимому, является одним из идентификаторов, который вам нужен, и правильным местом для принятия мер.

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 на слишком и удалить подобные ресурсы в маршрутах.