【问题标题】:Helper function in SinatraSinatra 中的辅助函数
【发布时间】:2013-09-03 19:15:57
【问题描述】:

我正在使用 Sinatra 来监控服务器。我需要阅读主文件夹中的文件夹列表,以及每个文件夹中 meta.xml 的内容。这是所需的输出:

<folders>
    <folder 1>
        <meta.xml content>
    <folder 2>
        <meta.xml content>
<\folders>

这是我当前的代码:

require 'sinatra'
require 'json'
require 'haml'

get '/processed' do
    status 200
    meeting_dir="/home/default"
    Dir.entries(meeting_dir)
end

我对 Sinatra 打印 get 块内所有变量的值感到困惑。如果我想写一个子函数getxml来生成xml,应该放在哪里呢?

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    helper:

    require 'sinatra'
    require 'json'
    require 'haml'
    
    helpers do
      def get_xml( *args )
        # your code here…
      end
    end
    
    get '/processed' do
      # getxml is available here
      status 200
      meeting_dir="/home/default"
      Dir.entries(meeting_dir)
    end
    

    现在,我假设您希望输出为 XML,因此该路由将不起作用,您将获得最后一个表达式的评估,当前为 Dir.entries(meeting_dir)

    设置view,并使用Haml's list_of helper,我们将准备好输出值列表:

    #views/contents.haml
    
    <folders>
      = list_of(@metas) do |meta|
       = "<#{meta.name}>"
         = meta.content
       = "</#{meta.name}>"
    <\folders>
    

    现在你需要一个@metas 对象:

    helpers do
    
      def get_xml( meeting_dir )
        dirs = Dir.entries(meeting_dir).reject{|e| e.start_with? "." }
        meta = Struct.new(:name, :content)
        dirs.each_with_object([]) do |d,metas|
          meta.name = d # it's up to you whether you 
                        # want the absolute or relative path here
          meta.content = File.read File.expand_path(File.join d, "meta.xml")
          metas << meta
        end
        # the return value of each_with_object
        # is the object, so no need for a return expression
      end
    end
    
    get '/processed', :provides => :xml do
      # status 200 <- this is not needed
      meeting_dir="/home/default"
      @metas = get_xml(meeting_dir)
      haml :contents, :layout => false
    end
    

    同时查看http://www.sinatrarb.com/intro.html#Conditionshttp://www.sinatrarb.com/intro.html#Named%20Templates。这应该给你一些事情要做。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2014-01-23
      • 2021-05-24
      相关资源
      最近更新 更多