2012-07-17 58 views
1

我是使用rails 3.2.3的RoR初学者。Ruby on Rails - 使用自定义动作设置自定义路线

我有一个产品资源和它下面的嵌套可用性资源。

我的路线是:

/products/:product_id/availabilities 

这是伟大的工作。但是,我的可用性模型允许在确切的日期设置产品的价格,例如:今天产品'x'将具有'y'可用性(它是整数)和'z'价格(价格也是可用性模型的一个属性)。

我的问题是,我现在想添加一个页面,允许修改价格(而不是创建一个新的价格模型),类似于我的可用性。我只使用索引操作,因为它会显示所选产品的所有可用性。

我怎样才能创建这样一个路径:

/products/:product_id/availabilities/prices 

我尝试添加这对我的路线RB:

match '/products/:id/availabilities/prices', :action => 'indexP', :via => [:get], :controller => 'prices' 
match '/products/:id/availabilities/prices', :action => 'createP', :via => [:post], :controller => 'prices' 

值得注意的是,我使用prices controller使用相同的交互可用性模型,但这应该不成问题。

我也在那prices controller创建了indexPcreateP的动作。 在我的Availabilities视图中,我创建了indexP.html.erb以区别于包含可用性的常规index.html.erb

当我运行rake routes我得到:

$ rake routes | grep prices 
          GET /products/:id/availabilities/prices(.:format) 
          POST /products/:id/availabilities/prices(.:format) 

这是伟大的。然而,当我访问该网址,我得到:

NoMethodError in Availabilities#show 
{"product_id"=>"46", 
"id"=>"prices"} 

为什么做show行动,而不是我的自定义是否匹配?

:我后是这样的:/产品/:ID /可用性/:ID /价格

只是:/产品/:ID /可用性/价格

我知道这可能是一个愚蠢的问题,但我会很感激任何提示,以帮助我了解发生了什么。

由于提前, 问候

回答

0

如何为您的产品型号设置?

如果是这样的:

resources :products do 
    resources :availabilities 
end 

路由没有在第一场比赛进入到可用性控制器的表演动作。

您有两种选择。限制可用性控制范围的,具有:

resources :products do 
    resources :availabilities, :only => [:index] 
end 

或将您的自定义匹配此块之前

match '/products/:id/availabilities/prices', :action => 'indexP', :via => [:get], :controller => 'prices' 
match '/products/:id/availabilities/prices', :action => 'createP', :via => [:post], :controller => 'prices' 

注意,该路由不被问题的REST。这可能给你带来麻烦以后:)

希望这有助于。

+1

哦,我......我不能相信时采取了先前的块之前该块位置......我完全以忘记这个重要的方面:第一'创建 - >最高priority.'感谢robertokl,虽然我也相信如果应用程序需要扩展,这可能会让我陷入困境,我感谢你帮助我这么快。虽然我建议任何其他人提出这个问题来创建一个新模型,以避免未来的麻烦。无论如何,标记为已回答,问候 – Silver 2012-07-17 17:32:58