在导轨上运行动态路由(Dynamic routes on runtime in Rails)

2019-10-18 13:32发布

我使用的炼油厂开发一个网站。 现在,对于在炼油厂的后端创建一个特定的页面,我想用我自己的控制器和视图。 所有用户可以用这个页面做的是设置菜单位置,标题,元信息等的URL,这个页面有看起来一样的所有其他网页。

因此,例如,菜单结构如下:

  • menux
  • MENU1
    • MENU2
      • 具体页面
  • menux

而对于“特定的页面”的URL看起来像“区域设置/菜单1 / MENU2 /特定页面”

该网站有多种语言版本,所以我必须创建这些路由所有的语言。

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

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

有了这个,我越来越到指定页面的路径在每一个语言如上述。

但问题是,当用户更改页面的名称,或在菜单中的位置,路线必须再次产生,这是不是做得太频繁。

现在的问题是,我怎么能做到这一点更动态的运行时间? 我读过一些有关限制,但我不知道这是我需要的。

谢谢你的帮助!

Answer 1:

我需要弄清楚建设路线关闭自己(数据库模型在Rails 4应用程序,它在下面的例子中被称为“ComingSoon”。我想,可能在后端进行编辑,并给用户友好的名称,页面,存储在页#名称字段左右。 "About Us"标题页通常会变成"about_us"的名字,这会导致"http://localhost:3000/about_us"以下是我想出的技术:

创建应用程序/模型/ 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作为参数之一,所以查找仍对页#id字段,这是,恕我直言,不是使用友好的插件或查找上slugerized值要好很多。

添加下面一行到你的config / routes.rb文件

ComingSoon::Application.routes.draw do

  # ...

  DynamicRouter.load
end

最后,当网页被更新,我们需要重新加载路线,所以在页面模型添加after_safe回调:

class Page < ActiveRecord::Base
  after_save :reload_routes

  def reload_routes
    DynamicRouter.reload
  end
end

我打算如果名称属性更改为进一步完善这一只重载线路,也许只需编辑现有的路由,而不是重新加载一切,如果性能被证明是一个问题(这在目前,它不是)。



文章来源: Dynamic routes on runtime in Rails