когда использовать перед фильтрами и собирать код (DRY) - PullRequest
0 голосов
/ 08 апреля 2010

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

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

Чтобы иметь / index со списком сервисных групп, мне нужнопереходите только к шагам 1 и 2.
Шаг 3 необходим только для / check (создание отчета и выборка / доступность печати)

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

Любой совет по архитектуре кода:)

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

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

1 Ответ

0 голосов
/ 08 апреля 2010

Вы можете использовать помощников:

helpers do
  def select_report_type
    # ...
  end

  def something_else
    # ...
  end
end

before { select_report_type }
get "/" do
  select_report_type
  # ...
  haml :index
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...