如何销毁我的订阅?

时间:2015-11-02 20:05:58

标签: ruby-on-rails-4 destroy

我有一个产品型号,一个用户模型和一个Subcription模型。产品有用户通过订阅,用户通过订阅有许多产品,订阅属于两者。

当用户喜欢某个产品时,会为其创建新的订阅。在我的subscription_controller中,我为此创建了函数like_project;就像一个魅力!

但我也尝试创建一个unlike-project函数来销毁该特定订阅。我只是无法让它发挥作用。我已被告知要破坏关系而不是对象,但我已经认为订阅是那种关系。

那么,我应该如何编写我的代码以确保用户也可以不同于它喜欢的产品(或销毁订阅)?

以下是我的订阅控制器的功能:

class SubscriptionController < ApplicationController

before_action :authenticate_user!
    def like_product
    product = Product.find(params[:product_id])
    current_user.subscriptions.create(product: product)

    recommender = ProductRecommender.new
    recommender.add_to_matrix!(:users, "user-#{current_user.id}", "product-#{product.id}")

    redirect_to product     
end

def unlike_product
    @subscription = Subscription.find(params[:id])
    product = @subscription.product
    @subscription.destroy

    recommender = ProductRecommender.new
    recommender.delete_from_matrix!(:users, "product-#{product.id}")

    redirect_to product     
end

private
    def subscription_params
        params.require(:subscription).permit(:product_id, :user_id)
    end
end

这就是我喜欢的产品:

                <div class="card-action center">

                <% if user_signed_in? %>
                    <%= form_tag productsubscribe_path do %>
                        <%= hidden_field_tag 'product_id', @product.id %>
                        <button type="submit" class="btn waves-effect waves-light black darken-2">Like project</button>
                    <% end %>
                <% else %>
                    <%= link_to new_user_session_path do %>
                        <button type="submit" class="btn waves-effect waves-light black darken-2">Like project</button>
                    <% end %>
                <% end %>
                </div>

......这就是我试图与产品不同的方式:

                <div class="">
                <%= form_tag productunsubscribe_path do %>
                    <%= hidden_field_tag 'product_id', @product.id %>
                        <button type="submit" class="btn waves-effect waves-light black darken-2">Unlike product</button>
                <% end %>
                </div>

您可以看到的推荐代码是推荐引擎,可以在产品被喜欢时将一个集合添加到Redis矩阵,并在不受欢迎时删除它。喜欢产品时不会产生任何问题,而且我认为不是因为不喜欢产品;)

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您的unlike_product控制器方法希望使用params[:id]来查找相关订阅。但是,在您的表单中,您似乎根本没有传递id参数 - 您拥有的唯一字段是product_id

<%= hidden_field_tag 'product_id', @product.id %>

params[:id]包含哪些内容?它是空的吗? params[:product_id]怎么样?我们希望不要空虚。而不是:

@subscription = Subscription.find(params[:id])

您需要查找product_id与您的param匹配的订阅,而user_id与登录用户的订阅匹配。