page. id——不起作用-6ren"> page. id——不起作用-我正在尝试使用 activeadmin 和 awesome_nested_set 创建页面模型。我一直在试图弄清楚如何使用正确的尾随 slug(例如/page1/page1subpage/a-subp-6ren">
gpt4 book ai didi

ruby-on-rails - 将 ID 传递给静态路由——匹配 page.url => "pages#show", :id => page. id——不起作用

转载 作者:行者123 更新时间:2023-12-04 05:57:59 30 4
gpt4 key购买 nike

我正在尝试使用 activeadmin 和 awesome_nested_set 创建页面模型。我一直在试图弄清楚如何使用正确的尾随 slug(例如/page1/page1subpage/a-subpage-of-page1subpage/等)创建动态路由。我在这里找到了其他人的帖子,里面有一些 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 传递到 route ?它只是将所有页面连接到 pages#show 而没有 id 参数。

另外,如果在 rails 3 中有更好的方法可以做到这一点,请告诉我。

编辑:看起来 rails 不喜欢传递 :id 作为参数.. 如果我将其更改为 :page_id 它可以工作..
match page.url, :controller => 'pages', :action => 'show', :page_id => page.id

我如何重新加载路线或在事件记录中执行此操作?

答案(稍后编辑):我最终制作了一个 after_validation 方法来检查 slug_changed?并为它自己和它的祖先和后代,重新为自己创建一个 url,保存它,然后调用:
MyAppName::Application.reload_routes!

我删除了路由中的 page.save 方法..这也会导致在新数据库上执行 rake db:migrate 等操作时出现一些问题。

最佳答案

match method应该认出:id :

Any options not seen here are passed on as params with the url.



不知道为什么 :id:page_id正在受到不同的对待。您可以使用 :defaults params 中设置默认值尽管:

You can also define other defaults in a route by supplying a hash for the :defaults option. This even applies to parameters that you do not specify as dynamic segments.



所以试试这个:
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 s 是正确的,并且它们已编入索引。 :constraints的精确形式您使用的将取决于您的 url值的样子。您还需要将此路线放在 routes.rb 的底部.

关于ruby-on-rails - 将 ID 传递给静态路由——匹配 page.url => "pages#show", :id => page. id——不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282680/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com