Tag: Ruby

Ruby – Sprawdzanie dostępności linku ze znakami z UTF-8

Przed kilkoma dniami natrafiłem na pewien problem. Mianowicie open-uri i metoda open nie działają dla znaków z utf-8 (czyli między innymi dla stron gdzie fragment URLa ma "ogonki"). W związku z czym, taki fragment kodu będzie zawsze zwracał fałsz, mimo tego, że pod adresem istnieje strona:

# coding: utf-8
# Wesja rzecz jasna uproszczona - bez obsługi timeoutów itd
url = 'http://www.nina.gov.pl/nina/czołówka'
io_thing = open(url)
correct = io_thing.status[0] == '200'

Zasadniczo bez obsługi błędów będziemy dostawać taki oto wyjątek:

 bad URI(is not URI?): www.nina.gov.pl/nina/czołówka (URI::InvalidURIError)

Rozwiązanie tego problemu może nie jest zbyt eleganckie ale działa:

# coding: utf-8
require 'open-uri'
require 'net/http'

url = 'http://www.nina.gov.pl/nina/czołówka'
url = URI.parse(URI.encode(url))

correct = false
level = 0
while(!correct && level < 10) do
  requst = Net::HTTP.new(url.host, url.port)
  if url.to_s.include?('https')
    requst.use_ssl = true
    requst.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  
  requst.start do |http|
    http = http.head(url.request_uri)
    if http.code == "200"
      correct = true
    else
      url = URI.parse(URI.encode(http.header['location'] ))
    end
    level += 1
  end
end

http.head nie podąża za przekierowaniami więc musimy robić to sami.

Rails3 i routes.rb – rozbicie (rozłożenie) na kilka plików

Wraz z rozrostem naszej aplikacji, zaczynają pojawiać się w niej przestrzenie nazw/moduły (namespaces). Dzięki takiemu podziałowi możemy zachować logikę w aplikacji dzieląc ją (przykład) np. na:

  • api
  • admin
  • dev

Wygodnie byłoby móc odwzorować taki podział także na pliku routes.rb, który niestety z czasem będzie rósł coraz bardziej. Aby temu zapobiec (i zapanować nad ew. rozrostem), warto rozdzielić plik routes.rb. Jak tego dokonać? Wystarczy utworzyć sobie katalog config/routes w nim utworzyć swoją herarchię plików (może być zagnieżdzona w subkatalogach). Następnie należy dodać poniższe linijki do pliku config/application.rb:

    # Ładuj wszystkie routy z katalogu config/routes
    Dir["#{Rails.root}/config/routes/**/*.rb"].each do |route_file|
      config.paths.config.routes << route_file
    end

Powyższy kod przeszukuje rekurencyjnie katalog z routsami i załącza te na które natrafi.

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑