Problemi con un blog ad XML con Sinatra

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CODICE
    require 'sinatra'
    require 'rexml/document'

    class News
           attr_accessor :date, :title, :content
           def initialize(date, title, content)
                   @date = date
                   @title = title
                   @content = content
           end
    end

    def parse(xml)
           news = []
           REXML::Document.new(xml).elements.each('repository/news') { |ele|
                   news << News.new(ele.elements['date'], ele.elements['title'], ele.elements['content'])
           }
           news
    end
           
    get '/x' do
           @title = 'Blog'
           @news = ''
           repository = parse(File.read('public/news.xml'))
           repository.each { |news|
                   @news += '<b>Title:</b> '+news.title.to_s
           }
           haml :index
    end
           
    not_found do
           status 404
           @title = '404'
           @msg = 'Error 404: Not found'
           haml :index
    end

    # XML
    =begin
    <?xml version="1.0" encoding="UTF-8"?>
    <repository>
           <news>
                   <date>Mon Nov 14 15:27:39 +0000 2011</date>
                   <title>Test #1</title>
                   <content>LOL</content>
           </news>
           <news>
                   <date>Mon Nov 14 15:27:39 +0000 2011</date>
                   <title>Test #2</title>
                   <content>TROLOLOL</content>
           </news>
    </repository>
    =end


    Output: `Title: Title:`
    Inoltre se metto i vari metodi in una classe, chiamando il metodo parse() ottengo un errore di comando non trovato.
     
    Top
    .
  2. meh.
     
    .

    User deleted


    Non usare REXML, usa Nokogiri.
     
    Top
    .
  3.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Ok, ora è perfetto, però vedo che è molto lento °°
    In ogni caso se volessi inserire i restanti tre metodi in una classe come richiamo poi il metodo parse() da get visto che mi dà MethodNotFoundException (vado a memoria)?
     
    Top
    .
  4. meh.
     
    .

    User deleted


    Non fai prima a fare un metodo di classe News.parse?
     
    Top
    .
  5.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    parse crea un array di oggetti News a partire da un XML, non vedo molto senso darlo a News a dire il vero.
     
    Top
    .
  6. meh.
     
    .

    User deleted


    QUOTE (Roxas Shadow @ 14/11/2011, 18:58) 
    parse crea un array di oggetti News a partire da un XML, non vedo molto senso darlo a News a dire il vero.

    Io si invece.
     
    Top
    .
  7.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Ho fatto in questo modo, anche se per quanto riguarda il tempo di esecuzione ottengo output del tipo `7.8e-05 seconds.`.
    CODICE
    require 'sinatra'
    require 'nokogiri'

    class News
           attr_accessor :date, :title, :content, :time
           def initialize(date=nil, title=nil, content=nil)
                   @time = Time.now
                   @date = date
                   @title = title
                   @content = content
           end
           def parse(xml)
                   news = []
                   Nokogiri::XML(xml).xpath('repository/news').each { |ele|
                           news << News.new(ele.xpath('date').inner_text, ele.xpath('title').inner_text, ele.xpath('content').inner_text)
                   }
                   news
           end
           
           def get_time
                   Time.now - @time
           end
    end

    news = News.new
    get '/blog' do
           @title = 'Blog'
           @news = ''
           repository = news.parse(File.read('public/news.xml'))
           repository.each { |news|
                   @news += "<b>Date:</b> #{news.date.to_s}<br />"
                   @news += "<b>Title:</b> #{news.title.to_s}<br />"
                   @news += "<b>Content:</b> #{news.content.to_s}"
                   @news += '<hr />'
           }
           @footer = "#{news.get_time.to_s} seconds."
           haml :index
    end

    not_found do
           status 404
           @title = '404'
           @news = 'Error 404: Not found'
           @footer = "#{news.get_time.to_s} seconds."
           haml :index
    end
     
    Top
    .
  8. meh.
     
    .

    User deleted


    QUOTE (Roxas Shadow @ 14/11/2011, 19:27) 
    Ho fatto in questo modo, anche se per quanto riguarda il tempo di esecuzione ottengo output del tipo `7.8e-05 seconds.`.
    CODE
    require 'sinatra'
    require 'nokogiri'

    class News
           attr_accessor :date, :title, :content, :time
           def initialize(date=nil, title=nil, content=nil)
                   @time = Time.now
                   @date = date
                   @title = title
                   @content = content
           end
           def parse(xml)
                   news = []
                   Nokogiri::XML(xml).xpath('repository/news').each { |ele|
                           news << News.new(ele.xpath('date').inner_text, ele.xpath('title').inner_text, ele.xpath('content').inner_text)
                   }
                   news
           end
           
           def get_time
                   Time.now - @time
           end
    end

    news = News.new
    get '/blog' do
           @title = 'Blog'
           @news = ''
           repository = news.parse(File.read('public/news.xml'))
           repository.each { |news|
                   @news += "<b>Date:</b> #{news.date.to_s}<br />"
                   @news += "<b>Title:</b> #{news.title.to_s}<br />"
                   @news += "<b>Content:</b> #{news.content.to_s}"
                   @news += '<hr />'
           }
           @footer = "#{news.get_time.to_s} seconds."
           haml :index
    end

    not_found do
           status 404
           @title = '404'
           @news = 'Error 404: Not found'
           @footer = "#{news.get_time.to_s} seconds."
           haml :index
    end

    Avevo detto metodo di classe io, non metodo d'istanza.
     
    Top
    .
  9.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CODICE
    require 'sinatra'
    require 'nokogiri'

    start = Time.now
    class News
           attr_accessor :date, :title, :content
           def initialize(date, title, content)
                   @date = date
                   @title = title
                   @content = content
           end
           def News.parse(xml)
                   news = []
                   Nokogiri::XML(xml).xpath('repository/news').each { |ele|
                           news << News.new(ele.xpath('date').inner_text, ele.xpath('title').inner_text, ele.xpath('content').inner_text)
                   }
                   news
           end
    end

    get '/blog' do
           @title = 'Blog'
           @news = ''
           repository = News.parse(File.read('public/news.xml'))
           repository.each { |news|
                   @news += "<b>Date:</b> #{news.date.to_s}<br />"
                   @news += "<b>Title:</b> #{news.title.to_s}<br />"
                   @news += "<b>Content:</b> #{news.content.to_s}"
                   @news += '<hr />'
           }
           @footer = "#{(Time.now - start).to_s} seconds."
           haml :index
    end

    not_found do
           status 404
           @title = '404'
           @news = 'Error 404: Not found'
           @footer = "#{(Time.now - start).to_s} seconds."
           haml :index
    end
     
    Top
    .
8 replies since 14/11/2011, 18:05   96 views
  Share  
.