0

リンクをクリックして製品をサブスクライブしようとすると、次のようになります。

<%= 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 として表示されるのでしょうか?

4

3 に答える 3

2

試す :

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

次のようなルートが生成されます。

subscribe_product_product POST     /product/:id/subscribe_product(.:format)   {:action=>"subscribe_product", :controller=>"products"}

ビューのようにパスを使用します:

subscribe_products_path(product.id)
于 2012-04-06T09:02:10.350 に答える
1

を渡しているidので、subscribe_productルートはルートである必要がありmemberます。これを試して、何が得られるか教えてください:

resources :products do
  member do
    post 'subscribe_product'
  end
end

コントローラーで (大量に割り当てられないアトリビュートを回避するため):

def subscribe_product
  @product = Product.find(params[:id])
  subscription = Subscription.new
  subscription.subscriber_id = current_user.id
  @product.subscriptions << subscription
end
于 2012-04-06T08:06:46.620 に答える
1

これを試してください。ルートを に変更:

resources :products do
  post :subscribe
end

次に、リンクを次のように変更します。

<%= link_to "Subscribe", subscribe_products_path(:id => product.id), :method => :post %>
于 2012-04-06T03:41:14.427 に答える