2010-04-08 2 views
0

Я закодировал некоторый скрипт Ruby, чтобы отказаться от некоторых веб-данных; затем я объединил этот сценарий с небольшим заявлением Sinatra, чтобы «опубликовать» некоторые методы отдыха для получения отчетов ...когда использовать перед фильтрами и собирать код (DRY)

Приложение My Sinatra направляет запрос в Nagios3 и перемещается по некоторым формам (фактически на 3 этапа). просто работаю нормально.
Затем в шаге 3 я «нажимаю» кнопку отправки, и через несколько секунд у меня есть огромный html-отчет с возможностями сервисных групп. На этом этапе я использую Nokogiri для извлечения только одного поля, это тоже отлично работает для любой сервисной группы (он может управлять любым измерением рабочей группы).

Чтобы иметь индекс/список со списком сервисных групп, мне нужно перейти только к этапам 1 и 2.
Step3 требуется только для/проверок (построить отчет и принесите/наличие печати)

Ну, все просто работают нормально, так что вопрос, который я делаю, как странно, потому что вещь, я не знаю, как правильно его высушить.
Я пишу #Initialize Mechanize, Step1 и Step2 внизу, перед фильтрами. Они необходимы как для индекса, так и для проверки, но на самом деле я не знаю, подходит ли это для этого.

Любой код архитектурный отзыв :)

заранее.
Франциско

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 %> 

ответ

0

Вы можете использовать хелперы:

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

Привет Константин; первое спасибо за ваш anwser :) Ну, мне нужно прочитать немного больше о помощниках (а также перед фильтрами) и сделать некоторые тесты; но на первый взгляд они выглядят как общий класс, который затем вызывается под фильтром через def; поэтому я думаю, что на практике они делают то же, что и моя гипотеза. Я не знаю, какой из них быстрее или который занимает меньше памяти или даже какой из них «более правильный», но я все равно попробую ваш совет :) эй, новичок здесь :) 10x – include

+0

На самом деле это не очень общий класс Sinatra ::Заявка. С помощниками вы просто добавляете к нему методы. Кроме того, производительность и память мудрые подход помощников должен дать вам лучшие результаты, так как закрытия немного дороже, чем методы. Но это не должно иметь большого значения. –

Смежные вопросы