2012-04-06 55 views
0

當我嘗試通過點擊鏈接來訂閱產品:操作方法是:id與link_to?

<%= 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呢?

回答

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 
+0

使用我的第一個link_to:'<%= link_to「Subscribe」,:controller =>「products」,:action =>「subscribe_product」,:id => product。id,:method =>:post%>',它給出了錯誤 - '沒有路由匹配[GET]「/ products/5/subscribe_product」' – LearningRoR 2012-04-06 12:50:39

+1

我認爲你的鏈接需要看起來像這樣):'<%= link_to「訂閱」,{:controller =>「products」,:action =>「subscribe_product」,:id => product.id},:method =>:post%>'。如果這不起作用,你可以運行'rake routes | grep subscribe_product'並讓我知道你得到了什麼。 – tsherif 2012-04-06 13:01:50

+0

我認爲它的工作,但我注意到我有'不能mass-assign受保護的屬性:subscriber_id,subscribable_type',所以我不能確定它。我不希望這些作爲大規模轉讓。現在我得到'Template Missing',但我可以有效地重定向。 – LearningRoR 2012-04-06 14:55:50

1

請試試這個。路線更改爲:

resources :products do 
    post :subscribe 
end 

然後改變像你鏈接:

<%= link_to "Subscribe", subscribe_products_path(:id => product.id), :method => :post %> 
+0

這給了我NoMethodError因爲正在查看的產品在不同的控制器。不知道該如何處理。我將編輯我的答案並顯示控制器和視圖。 – LearningRoR 2012-04-06 03:55:57

+0

什麼樣的沒有方法錯誤?在哪個方法上?請嘗試使用subscribe_products_path,但我在命名路由的順序上犯了一個錯誤:P – Spyros 2012-04-06 04:07:59

+0

我必須使它成爲'post:subscribe,:on =>:collection',但是接收到錯誤'無法找到沒有產品一個ID'。 – LearningRoR 2012-04-06 04:14:14

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)