我正在尝试使用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这样的事情时也会导致一些问题。
答案 0 :(得分:3)
match
method应该识别:id
:
此处未见的任何选项都会以url传递给params。
我不知道为什么:id
和:page_id
被区别对待。您可以使用:defaults
在params
中设置默认值:
您还可以通过为
: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
。