Как отписаться от модели? - PullRequest
0 голосов
/ 11 апреля 2020

Я добавляю функцию подписки, где пользователи могут подписаться / отказаться от подписки на жанр. Мне удалось создать подписку, но я не знаю, как отписаться, если пользователь уже подписался.

Я использовал отношение 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"

1 Ответ

0 голосов
/ 11 апреля 2020

Проблема в том, что вы пытаетесь удалить новую подписку.

У вас есть это:

@subscription = Subscription.new

, а затем у вас есть это:

= link_to @subscription, method: :delete

эта подписка не может быть удалена, поскольку она не является постоянной подпиской.

Вы должны использовать фактическую запись подписки, которую хотите удалить, поэтому измените свой контроллер на:

@subscription = current_user ? current_user.subscriptions.where(genre: @genre).first : nil # get the subscription for the current user and genre
@subscription ||= Subscription.new # if nil, use a new subscription

Затем в вашем просмотр вы можете сделать:

<% if @subscription.persisted? %>
  <%= 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...