【问题标题】:Ruby on Rails - Setting a Custom Route with Custom ActionRuby on Rails - 使用自定义操作设置自定义路由
【发布时间】:2012-07-17 17:04:46
【问题描述】:

我是使用 rails 3.2.3 的 RoR 初学者。

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

我的路线是:

/products/:product_id/availabilities

效果很好。

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

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

如何创建如下路线:

/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 操作。 在我的可用性视图中,我创建了一个 indexP.html.erb 以区别于包含可用性的常规 index.html.erb

当我运行 rake routes 时,我得到:

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

这很棒。但是,当我访问该 URL 时,我得到:

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

为什么它执行show 操作而不是我的自定义匹配?

注意:我不是喜欢以下内容:/products/:id/availabilities/:id/prices

只是:/products/:id/availabilities/prices

我知道这可能是一个愚蠢的问题,但如果有任何提示可以帮助我了解正在发生的事情,我将不胜感激。

提前致谢, 问候

【问题讨论】:

    标签: ruby-on-rails routes custom-action custom-routes


    【解决方案1】:

    您的产品模型设置如何?

    如果是这样的:

    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'
    

    请注意,这条路线不是满载的。这可能会给你带来麻烦:)

    希望这会有所帮助。

    【讨论】:

    • 哦,天哪...我不敢相信只是将那个块定位在前一个块之前...我完全忘记了这个重要方面:first created -> highest priority. 谢谢 robertokl,虽然我也相信万一应用程序需要扩展,这会给我带来麻烦,我感谢你如此迅速地帮助我。尽管我建议其他有这个问题的人创建一个新模型,以避免未来的麻烦。无论如何,标记为已回答,问候
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多