gpt4 book ai didi

ruby-on-rails - Rails 中运行时的动态路由

转载 作者:行者123 更新时间:2023-12-02 17:42:49 25 4
gpt4 key购买 nike

我正在使用 refinery 开发网站。现在对于在精炼厂后端创建的一个特定页面,我想使用我自己的 Controller 和 View 。用户对该页面所能做的就是设置菜单位置、标题、元信息等。该页面的 URL 必须与所有其他页面看起来相同。

例如,菜单结构如下所示:

  • 菜单
  • 菜单1
    • 菜单2
      • 特定页面
  • 菜单

“特定页面”的 URL 看起来像“locale/menu1/menu2/specific page”

该网站有多种语言版本,因此我必须为所有语言创建这些路线。

目前我正在创建这样的路线:

specific_page_id = 1
Refinery::I18n.frontend_locales.each do |lang|
slugs = []
page = Refinery::Page.find_by_path_or_id(nil, specific_page_id)
# get slug for page in current language
slugs << page.translations.select { |p| p.locale == lang }.first.slug

# get all slugs from parrent pages
while !page.parent_id.blank?
page = Refinery::Page.find_by_path_or_id(nil, page.parent_id)
slugs << page.translations.select { |p| p.locale == lang }.first.slug
end

match "/:locale/#{slugs.reverse.join("/")}" => "controller#action", :via => :get, :constraints => { :locale => /#{lang}/ }
end

有了这个,我得到了一个到指定页面的路由,用如上所述的每种语言。

但问题是,当用户更改页面名称或菜单中的位置时,必须重新生成路由,这种情况并不经常发生。

现在我的问题是,如何在运行时更动态地执行此操作?我读过一些关于约束的内容,但我不知道这是否是我需要的。

感谢您的帮助!

最佳答案

我需要自己在 Rails 4 应用程序(在下面的示例中称为“ComingSoon”)中找出基于数据库模型的构建路线。我想要可以在后端编辑的页面并提供用户友好的名称,存储在 Page#name 字段中。因此,标题为 "About Us" 的页面通常会变成 "about_us" 名称,这会导致 "http://localhost:3000/about_us" 以下是我想出的技术:

在 app/models/dynamic_router.rb 中创建一个新模型

class DynamicRouter
def self.load
ComingSoon::Application.routes.draw do
Page.all.each do |pg|
get "/#{pg.name}", :to => "pages#show", defaults: { id: pg.id }, as: "pages_#{pg.name}"
end
end
end

def self.reload
ComingSoon::Application.routes_reloader.reload!
end
end

上面的关键是我将页面的 id 作为参数之一传递,所以查找仍然在 Page#id 字段上,恕我直言,这比使用友好的插件或查找 slugerized 值要好得多。

将以下行添加到您的 config/routes.rb

ComingSoon::Application.routes.draw do

# ...

DynamicRouter.load
end

最后,当 Page 更新时,我们需要重新加载路由,所以在 Page 模型上添加一个 after_safe 回调:

class Page < ActiveRecord::Base
after_save :reload_routes

def reload_routes
DynamicRouter.reload
end
end

我计划进一步完善这一点,以便仅在 name 属性更改时才重新加载路由,并且如果性能被证明是一个问题(目前还不是),可能只是编辑现有路由而不是重新加载所有内容。

关于ruby-on-rails - Rails 中运行时的动态路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481458/

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