0

我需要帮助来确定如何为我创建一个链接Product,使用户能够订阅它。我首先有我的Subscription模型:

class Subscription < ActiveRecord::Base
  attr_accessible :subscribable_id
  belongs_to :subscriber, :class_name => "User"
  belongs_to :subscribable, :polymorphic => true
end

然后我的Product模型:

class Product < ActiveRecord::Base
  attr_accessible :name, :price
  belongs_to :user
  has_many :subscriptions, :as => :subscribable
end

我的计划是制作我的视图,类似于DELETE单击以订阅产品的链接的方法。这是我的路线,控制器然后查看:

resources :products do
    post :subscribe_product, :on => :collection
end

产品控制器:

def subscribe_product
  @product = Product.find(params[:id])
  # Not sure what goes here next? 
  # Something like: user.subscriptions.create(:subscribable => product)
end

看法:

<table>
 <% for product in @products %>
  <tbody>
   <tr>
    <td><%= product.name %></td>
    <td><%= product.price %></td>
    <td><%= link_to 'Delete', product, :confirm => 'Are you sure?', :method => :delete %></td>
    <td><%= link_to 'Subscribe', :controller => "products", :action => "subscribe_product", :id => product.id %></td>
   </tr>
  </tbody>
 <% end %>
</table>

现在这给出了一个奇怪的错误:

ActiveRecord::RecordNotFound in ProductsController#show

Couldn't find Product with id=subscribe_product

他们的两件事,

  1. 创建订阅方法。
  2. 使链接正确。

我该怎么做这两个?

4

2 回答 2

2

默认情况下,link_to 使用 GET,因此您的路由器认为您正在尝试转到 ProductsController#show,第一个参数是 ID

http://yoursite.com/products/subscribe_product/5

这是对产品控制器的获取请求,其 id 参数为 subscribe_product。

如果您将 :method => :post 传递给您的 link_to 助手,它将发出一个发布请求,这正是您的路由器所期望的。

<%= link_to 'Subscribe', :controller => "products", :action => "subscribe_product", :id => product.id, :method => :post %>

如果不发布您的用户模型,我无法确定,但该方法将如下所示:

@product.subscriptions.create(:user_id => user.id)
# user.id would be current_user.id, or whatever you are storing the current user as
于 2012-04-05T20:46:29.153 回答
0

您的subscribe_product路径使用 POST,因此您需要更改链接以使用该方法:

<%= link_to 'Subscribe', {:controller => "products", :action => "subscribe_product", :id => product.id}, :method => :post %>

您的操作可能如下所示:

@product.subscriptions << Subscription.new(:user_id => current_user.id)
于 2012-04-05T20:49:37.810 回答