リンクをクリックして製品をサブスクライブしようとすると、次のようになります。
<%= link_to "Subscribe", :controller => "products", :action => "subscribe_product", :id => product.id, :method => :post %>
このエラーが発生し、パラメーターが間違っていることに気付きました。
ActiveRecord::RecordNotFound in ProductsController#show
Couldn't find Product with id=subscribe_product
{"id"=>"subscribe_product", "method"=>"post"}
ProductsController の subscribe_product メソッドは次のとおりです。
def subscribe_product
@product = Product.find(params[:id])
@product.subscriptions.create(:subscriber_id => current_user.id)
end
私のルート:
resources :products do
post :subscribe_product, :on => :collection
end
関連付けは次のとおりです。
class User
has_many :products
has_many :subscriptions, :foreign_key => :subscriber_id
class Product
belongs_to :user
has_many :subscriptions, :as => :subscribable
class Subscriptions
belongs_to :subscriber, :class_name => "User"
belongs_to :subscribable, :polymorphic => true
ユーザーは別のコントローラーでサブスクライブします。
PagesController
def index
@product_history = current_user.products
end
end
pages/index.html.erb
<% for product in @product_history %>
<%= product.name %>
<%= product.price %>
<%= link_to "Subscribe", :controller => "products", :action => "subscribe_product", :id => product.id, :method => :post %>
<% end %>
では、なぜ私のアクション メソッドが代わりに ID として表示されるのでしょうか?