Я добавляю функцию подписки, где пользователи могут подписаться / отказаться от подписки на жанр. Мне удалось создать подписку, но я не знаю, как отписаться, если пользователь уже подписался.
Я использовал отношение has_many: through для этой функции. Я не опубликовал детали этого, потому что текстовый редактор SO считает, что я написал слишком много кода.
subscription table
create_table "subscriptions", force: :cascade do |t|
t.integer "user_id"
t.integer "genre_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["genre_id"], name: "index_subscriptions_on_genre_id"
t.index ["user_id"], name: "index_subscriptions_on_user_id"
end
subscriptions_controller.rb
class SubscriptionsController < ApplicationController
def create
@subscription = Subscription.new(subscription_params)
@subscription.user_id = current_user.id
@subscription.save
redirect_to genre_path(@subscription.genre_id)
end
def destroy
if @subscription.destroy
redirect_back(fallback_location: root_path)
flash[:danger] = %Q[<i class="fa fa-trash"></i> You have successfully
unsubscribed from this genre.]
end
end
private
def subscription_params
params.require(:subscription).permit(:genre_id)
end
end
genres_controller.rb
def show
@subscriber_count = @genre.subscribers.count
@is_subscribed = user_signed_in? ? Subscription.where(genre_id: @genre.id,
user_id: current_user.id).any? : false
@subscription = Subscription.new
@sub_genres = Subscription.where(genre_id: @genre)
end
genres/show
<div class="subscribe">
<% if @is_subscribed %>
<%= link_to @subscription, method: :delete, class: "btn btn-danger btn-sm"
do %>
<%= fa_icon "times" %> Unsubscribe
<% end %>
<% else %>
<%= render partial: "genres/subscribe", locals: { genre_id: @genre.id }
%>
<% end %>
</div>
genres/_subscribe
<%= form_with(model: @subscription, local: true) do |form| %>
<%= form.hidden_field :genre_id, value: genre_id %>
<%= form.submit "Subscribe", class: "btn-primary" %>
<% end %>
routes.rb
resources :subscriptions
Когда я нажимаю на ссылку удаления, я получаю ошибку:
No route matches [DELETE] "/subscriptions"