1

使用:Rails 3.1.1 和 Friendly_id 用于 url。

我认为这应该相当容易,但我无法弄清楚。

我有一个看起来像这样的嵌套路由:

  resources :pages, :path => '' do
    # WHAT_DO_I_TYPE_HERE
    resources :products, :except => [:index], :path => '' do
        member do
            post 'broken_link'
        end
    end    
  end

未标记的 (#) 行是我要弄清楚的行。基本上我有如下所示的网址:

domain.com/page_name/product_name/(通过friendly_id),例如domain.com/music/mp3/。

我想使用 url domain.com/music/edit 来编辑关于音乐的页面。

现在,如果我输入:<blank> # ie nothing...将该行留空 --- 我收到错误“找不到具有 id=edit 的产品”,这在某种程度上是有道理的。它试图找到一个名为编辑的产品,而不是方法编辑。因此,我尝试使用 b。match 'edit', :controller => 'pages', :action => 'edit' --- 这给了我错误“找不到没有 ID 的页面”,我想这也是有道理的。

那么我应该写什么来告诉路线在检查产品名称之前检查编辑方法?

4

1 回答 1

0

我之前也遇到过这个问题……你可以做一些事情来实现你想要的url路由……

首先,使用您那里的代码,我建议查看rake routes命令行中为与 page_path 或 page_product / product_page 路径相关的任何内容生成的内容,并查看它捕获的 url + 它们的命名路由。

如果它不是你想要的..那么你可以尝试把:

get '/:id' => 'products#show'

代替你的# WHAT_DO_I_TYPE_HERE

虽然,您可能需要对此进行限制(请参阅底部的链接),以便您仍然可以拥有您的/mypage/editmypage/new...

您真正想要做的是设置如下所示的路线:

match '/:page_id/:id' => 'products#show', :as => 'product'

这应该在这些路线之上的某个地方,并且可以通过product_show_path. 这假设您使用的是标准拥有/属于关系。

您可以将:as => 'product'部分重命名为您想要的任何内容,

例如::as => 'public_product'

然后更新您的链接以在需要的地方显示 public_products_path

在您的 products#show 操作中,您应该执行以下操作:

@product = Product.find(:id => params[:id], :page_id => params[:page_id])

您还可以考虑对路线施加限制……我在这里整理了一个 Gist 供我自己参考,可能对您有用。 https://gist.github.com/1908782

另外,我遇​​到了另一个问题的答案,这也可能对您有所帮助... https://stackoverflow.com/a/5443829/308701

希望在某种程度上有所帮助:D

于 2012-03-03T11:47:12.877 回答