【问题标题】:Sinatra: pass nested routes to controllersSinatra:将嵌套路由传递给控制器
【发布时间】:2017-11-23 12:00:33
【问题描述】:

我尝试使用 Sinatra 实现的是,我认为是相当简单的问题。我有一堆控制器(来自 Rails 世界),我从我的 config.ru 运行它们,看起来像:

require 'sinatra/base'
require './app'

# require all the parts needed
Dir.glob('./{controllers,helpers,models}/*.rb').each { |file| require file }

# start the server via Rack map method which binds route to Sinatra app
map('/') { run ApplicationController }
map('/') { run AuthenticationController }
map('/customers') { run CustomerController }
map('/contact_us') { run ContactUsController }

它们是 ApplicationController 的子类(它本身是 App

  get '/:id/home' do
    erb :'/customers/home'
  end

我想要做的是能够使用像 /customers/:id/contacts 这样的带有 id 的嵌套路由,而无需在控制器中复制整个路径。我不能用地图做到这一点,使用 namespace 似乎也不是解决这个问题的方法。我愿意接受如何更好地构建它以实现这一目标的建议。

谢谢。

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    您应该能够这样做(注意:您应该useing 每个额外的控制器而不是运行它们。

    run ApplicationController
    use AuthenticationController
    use CustomerController
    use ContactUsController
    

    然后在每个控制器中,您需要像这样继承 ApplicationController 类:

    class AuthenticationController < ApplicationController
        get "/" do
            erb :index
        end
    end
    


    奖金:

    您甚至可以将其添加到您的 config.ru 以避免必须为所有这些控制器输入 use

    Dir[File.join(File.dirname(__FILE__), "app/controllers", "*.rb")].collect {|file| File.basename(file).split(".")[0] }.reject {|file| file == "application_controller" }.each do |file|
      string_class_name = file.split('_').collect { |w| w.capitalize }.join
      class_name = Object.const_get(string_class_name)
      use class_name
    end
    

    【讨论】:

    • 谢谢,很有趣,这意味着如果我没有误将它们用作中间件。我需要阅读它。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多