将ID传递到静态路由 - 匹配page.url => “pages#show”,:id => page.id - 不工作

时间:2012-02-14 19:06:16

标签: ruby-on-rails ruby-on-rails-3 routes

我正在尝试使用activeadmin和awesome_nested_set创建页面模型。我一直在试图弄清楚如何用正确的尾随slu创建动态路线(例如/ page1 / page1subpage / a-subpage-of-page1subpage / etc)。我在这里找到了一个帖子,其中有一些rails2代码,我在我的routes.rb中找到了这个:

Page.all.each do |page|
  page.url = "/"+page.self_and_ancestors.map{|p| p.slug}.join("/")
  page.save
  match page.url => "pages#show", :id => page.id
end

它只是没有传递任何ID。如何让rails3将ID传递给路由?它只是将所有页面连接到页面#show with no id param。

如果有更好的方法在rails 3中执行此操作,请告诉我。

编辑:它看起来像rails不喜欢传递:id作为参数..如果我将其更改为:page_id它可以工作..

match page.url, :controller => 'pages', :action => 'show', :page_id => page.id

如何重新加载路线或在活动记录中执行此操作?

回答(稍后编辑):我最终制作了一个检查slug_changed的after_validation方法?并为它自己和它的祖先和后代,重新创建一个自己的网址,保存它,然后调用:

MyAppName::Application.reload_routes!

我删除了路由中的page.save方法..在执行像rake db:migrate on new DBs这样的事情时也会导致一些问题。

1 个答案:

答案 0 :(得分:3)

match method应该识别:id

  

此处未见的任何选项都会以url传递给params。

我不知道为什么:id:page_id被区别对待。您可以使用:defaultsparams中设置默认值:

  

您还可以通过为:defaults选项提供哈希来定义路由中的其他默认值。这甚至适用于未指定为动态段的参数。

所以试试这个:

Page.all.each do |page|
  page.url = "/" + page.self_and_ancestors.map { |p| p.slug }.join("/")
  page.save
  match page.url => "pages#show", :defaults => { :id => page.id }
end

请注意,每次加载page时,每次routes.rb都会更新,这可能不是您要查找的内容。您可能希望将URL设置放在其他位置,只需将其设置为:

Page.all.each do |page|
  match page.url => 'pages#show', :defaults => { :id => page.id }
end

routes.rb

通常的方法是使用一条路线:

get '/:slug' => 'pages#show', :constraints => { :slug => %r([\p{Alnum}_.-/]+) }

然后使用:slug代替:id查找页面:

def show
  @page = Page.find_by_url(params[:slug])
  #...
end

然后您根本不必担心动态路由,您只需要确保url是正确的并且它们已被编入索引。您使用的:constraints的确切形式取决于您的url值的外观。您还希望将此路线放在routes.rb

的底部