ruby-on-rails 从rails数据库模型添加动态路由?

x4shl7ld  于 2023-02-17  发布在  Ruby
关注(0)|答案(2)|浏览(185)

如何使用模型activeRecord从数据库添加动态路由:
我尝试:(使用Rails 5)

Rails.application.routes.draw do
  router = self
  Var.find_by(name: 'pages').value.split(',').each do |page|
    router.get "/#{page}", to: 'application#page', as: page
  end
end

但是当我尝试启动rails服务器时出现错误:
'mysql2_connection中的救援':未知数据库'dale'(活动记录::NoDatabaseError)

f87krz0w

f87krz0w1#

您可以移动访问数据库的代码以初始化块。

Rails.application.routes.draw do
  router = self
  Rails.application.config.after_initialize do
      Var.find_by(name: 'pages').value.split(',').each do |page|
        router.get "/#{page}", to: 'application#page', as: page
      end
  end
end

不能保证你的初始化器会在所有的gem初始化器之后运行,所以任何依赖于给定gem已经初始化的初始化代码都应该进入config.after_initialize块。
Rails有5个初始化事件可以挂接(按运行顺序列出):Rails文档初始化事件中的更多详细信息

5kgi1eie

5kgi1eie2#

您遇到的问题是因为Var.find_by(name: 'pages')正在尝试运行ActiveRecord查询,但是Rails.application.routes.draw块是在应用程序启动时和建立数据库连接之前执行的。
要解决此问题,可以将定义动态路由的逻辑移到控制器操作中,该操作将在建立数据库连接后运行,然后可以在操作中使用redirect_to重定向到适当的路由:

# in your controller
def pages
  page = params[:page]
  redirect_to "/#{page}"
end

# in your routes file
Rails.application.routes.draw do
  get 'pages', to: 'application#pages'
  Var.find_by(name: 'pages').value.split(',').each do |page|
    get "/#{page}", to: 'application#page', as: page
  end
end

通过这种方式,当向/pages URL发出请求时,pages操作将运行并基于page参数重定向到适当的路由。
希望这能帮上忙。

相关问题