在Ruby中,如何将块从类中移出到它自己的文件中?

史蒂夫·凯里

作为学习练习,我正在制作一个简化的类似Rails的MVC框架。这是流程的简化版本。框架和应用程序在这里结合在一起。

1)启动一个新的Rack应用程序。

# config.ru
require_relative 'config/application.rb'
run Application.new

2)实例化一个Rack请求对象,然后实例化一个新的Router类实例,传递该请求对象,并调用resolve方法。

# config/application.rb
require_relative '../lib/router.rb'
class Application
  def call(env)
    request = Rack::Request.new(env)
    Router.new(request).resolve
  end
end

3)创建Router实例后,我正在构建一个@routes变量,该变量分配给应用程序路由及其对应的控制器和操作的哈希。像Rails一样,这是一个障碍。绘制和匹配方法在同一路由器类中定义。Draw运行块,match方法将每个路由添加到@routes哈希中。这很好。

# lib/router.rb
class Router
  attr_reader :request, :routes

  def initialize(request)
    @request = request
    @routes = {}
    draw do
      match "/", "pages#home"
      match "/contact", "pages#contact"
      match "/about", "pages#about"
    end
  end

  def draw(&block)
    instance_eval(&block)
  end

  def match(url, controller_action)
    @routes["#{url}"] = controller_action
  end
  # more code... def resolve, etc.
end

像Rails一样,我希望在其自己的文件中包含绘图块,以便可以在应用程序的config / routes.rb文件中设置路线,并在框架的lib / router.rb文件中对其进行操作。我该怎么做呢?我尝试过的一切都会引发错误。

用户名

尽管它不太像Rails,但您可以尝试根据情况进行调整:

文件routes.rb

class Routes                                                                                                            
  def self.routes                                                                                                       
    Proc.new do                                                                                                         
      match 'url', 'foo#bar'                                                                                            
      match 'url2', 'foo#baz'                                                                                           
    end                                                                                                                 
  end                                                                                                                   
end 

文件router.rb

require_relative './routes'                                                                                             

class Router                                                                                                            
  attr_reader :routes                                                                                                   

  def initialize                                                                                                        
    @routes = {}                                                                                                        

    draw Routes.routes                                                                                                  
  end                                                                                                                   

  def draw(block)                                                                                                       
    instance_eval(&block)                                                                                               
  end                                                                                                                   

  def match(url, handler)                                                                                               
    @routes[url] = handler                                                                                              
  end                                                                                                                   
end 

这样就可以在一个单独的文件路径中定义:

p Router.new.routes # => {"url"=>"foo#bar", "url2"=>"foo#baz"}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 pg_dump 各种对象解析到它自己的文件中?如函数、表、视图、索引等

我在尝试将多个 XLS 表中的每个导出到它自己的 R 中的 csv 文件时遇到问题

如何将csv文件复选框值导出到ruby中的ruby表中?

如何将文件移出 Linux 中损坏的目录?

如何让 VSTS 将每个分支构建到它自己的放置文件夹中

如何将嵌套对象中的字段从嵌套对象移出到弹性索引中的单独对象中

如何将所有不推荐使用的类列出到文件中?

将域的BLL包装到它自己的类库中是否合理,我将如何设置它?

如何将数组列表导出到csv文件中?

如何将功能输出到文件中

如何将嵌套的dict导出到excel文件中?

在python中将一个类移动到它自己的文件中

如何将Seaborn FacetGrid中的图例移出情节?

Webpack:将 css 提取到它自己的包中

如何将 Git 存储库中的所有分支列出到自己的控制台中

如何将代码块从组织模式导出到封装到框架中的pdf

如何将文件中的文本读入 ruby 中的数组

如何让函数在 C 中返回它自己的类型?

如何在它自己的应用程序中打开文件,如 Windows 中的“start”以及如何使用“start.”?

如何将数据库表中的所有记录导出到文件中?

Android:如何将目录中的所有文件列出到数组中?

如何将HTML页面导出到Laravel中的图像文件中?

如何将GG Bigquery中存储的数据导出到GZ文件中。

如何将Shotshot中的一组照片导出到文件夹中?

如何将sql server中的大量数据导出到excel文件中

如何将 PyCharm 文件中的数据导出到 Excel 工作表中?

如何使Visual Studio在LinqPad.exe中而不是它自己的编辑器中打开.linq文件

如何将span标签和类保留在TinyMce中的预代码块中

模块或类中的Ruby块