2010-04-08 5 views
0

J'ai codé un script Ruby pour mettre au rebut certaines données Web; puis j'ai fusionné ce script avec une petite application Sinatra pour "publier" des méthodes de repos pour récupérer des rapports ...quand utiliser avant les filtres et sur le point d'organiser le code (DRY)

Mon application Sinatra fait une demande à Nagios3 et navigue à travers des formulaires (3 étapes en fait), ceci est fonctionne bien.
Ensuite, à l'étape 3, j'appuie sur le bouton Soumettre et après quelques secondes, j'ai un énorme rapport html avec les disponibilités des groupes de service. À ce stade, j'utilise Nokogiri pour extraire un seul champ, cela fonctionne très bien pour n'importe quel groupe de service (il peut gérer n'importe quelle dimension de groupe de service).

Pour avoir l'index/avec une liste de groupes de service, je dois passer à Step1 et Step2 seulement.
Le Etape3 est nécessaire seulement pour/contrôle (construire le rapport et Fetch/print disponibilité)

Eh bien, tout est juste fonctionne très bien si la question que je fais est comme bizarre parce que la chose est que je ne sais pas comment le sécher correctement.
J'écris les trucs #Initialize Mechanize, Step1 et Step2 sous before filter. Ils sont nécessaires à la fois dans/index et/check, mais en fait je ne sais pas si c'est le bon endroit pour le faire. Astuce architecturale code

merci d'avance.
Francisco

require 'rubygems' 
require 'sinatra' 
require 'mechanize' 
require 'nokogiri' 
require 'logger' 

configure :production do 
    enable :logging, :dump_errors 
    enable :inline_templates 
    disable :run 
end 

error do 
    e = request.env['sinatra.error'] 
    puts e.to_s 
    puts e.backtrace.join("\n") 
    "Application Error!" 
end 

not_found do 
    "Page not found!" 
end 

before do 
    content_type 'text/html', :charset => 'utf-8' 

    # Initialize Mechanize 
    @agent = Mechanize.new 
    @agent.keep_alive = false 
    @agent.open_timeout = 3600 
    @agent.read_timeout = 3600 
    @agent.max_history = 0 
    @agent.log = Logger.new('mechanize.log') 
    @agent.auth('myusername', 'mysecretpass') 
    @page = @agent.get('http://nagios3/nagios/cgi-bin/avail.cgi') 

    # Step1 and Step2 are use in both /index and /check 

    # Step1 - Form1 (Select Report Type[hostgroups,hosts,hostgroups,servicegroups*,services]) 
    @form1 = @page.forms.first 
    @form1.field_with(:name => 'report_type').options[2].select 
    @page = @agent.submit(@form1) 

    # Step2 - Form2 (Select Servicegroup) 
    @form2 = @page.forms.first 
    @total_services_list = @form2.field_with(:name => 'servicegroup').options 
end 

get '/' do 
    # When under /index we don't go further to Step3 - Form3 (generate report) 
    erb :index 
end 

get '/check/:servicegroup' do 

    @servicegroup = params[:servicegroup].to_i 

    # Step3 - Form3 (Select Report Options) 
    @form2.field_with(:name => 'servicegroup').options[@servicegroup].select 
    @page = @agent.submit(@form2) 

    @form3 = @page.forms.first 
    @form3.field_with(:name => 'timeperiod').options[7].select 
    @page = @agent.submit(@form3) 

    # Step4 - Extract Average from computed data 
    page_html = Nokogiri::HTML.parse(@page.body) 
    @total_hostservices_size = page_html.xpath("html/body/div[3]/table/tr[*]/td[2]").to_a.size 
    puts @average = page_html.xpath("html/body/div[3]/table/tr[#{@total_hostservices_size}]/td[2]").inner_text 

    erb :check, :layout => false 
end 


__END__ 


@@layout 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head><title>Nagios Availability Checker</title></head> 
    <body> 
     <strong>Nagios Availability Checker</strong> 
     <hr /> 
     <div> 
      <%= yield %> 
     </div> 
     <hr /> 
    </body> 
</html> 

@@index 
<h3>List Service Groups</h3> 
<% @total_services_list.each_with_index do |name,id| %> 
    <a href="/check/<%= id %>"><%= id %> - <%= name %></a><br /> 
<% end %> 

@@check 
    <%= @average %> 

Répondre

0

Vous pouvez utiliser les aides:

helpers do 
    def select_report_type 
    # ... 
    end 

    def something_else 
    # ... 
    end 
end 

before { select_report_type } 
get "/" do 
    select_report_type 
    # ... 
    haml :index 
end 
+0

Salut Konstantin; premier merci pour votre réponse :) Eh bien j'ai besoin de lire un peu plus sur les aides (et aussi avant les filtres) et faire quelques tests; mais à première vue ils ressemblent à une classe générique qui s'appelle alors sous filtre avant via def; donc je pense que dans la pratique ils font la même chose que mon hypothèse. Je ne sais pas lequel est le plus rapide ou qui prend moins de mémoire ou même lequel est "plus correct" mais je vais essayer votre conseil de toute façon :) hé, débutant ici :) 10x – include

+0

Il est en fait une classe pas si générique Sinatra ::Application. Avec des aides, vous ajoutez simplement des méthodes. En outre, la performance et la mémoire de l'approche helpers devrait vous donner de meilleurs résultats, car les fermetures sont un peu plus cher que les méthodes. Mais cela ne devrait pas avoir beaucoup d'importance. –