2011-01-19 19 views
5

mam następujący powrotem z delayed_job:nieprawidłowy identyfikator URI - jak zapobiec, URI :: InvalidURIError errors?

[Worker(XXXXXX pid:3720)] Class#XXXXXXX failed with URI::InvalidURIError: bad URI(is not URI?): https://s3.amazonaws.com/cline-local-dev/2/attachments/542/original/mac-os-x[1].jpeg?AWSAccessKeyId=xxxxxxxx&Expires=1295403309&Signature=xxxxxxx%3D - 3 failed attempts 

Sposób ten pochodzi z URI w moja aplikacja jest.

W moim user_mailer zrobić:

@comment.attachments.each do |a| 
    attachments[a.attachment_file_name] = open(a.authenticated_url()) {|f| f.read } 
    end 

Wtedy w moim modelu Załączniki:

def authenticated_url(style = nil, expires_in = 90.minutes) 
    AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => attachment.s3_protocol == 'https') 
    end 

Powiedział, że jest to jakiś rodzaj URI.encode lub parsowania mogę zrobić, aby zapobiec poprawny URI (tak jak sprawdziłem adres URL działa w mojej przeglądarce) za błędy i zabicie delayed_job w szynach 3?

Dziękujemy!

+0

Próbowałem 'open (URI.parse (URI.encode (a.authenticated_url()))', ale że errord z OpenURI :: httpError: 403 Forbidden – AnApprentice

+0

Błąd nie oznacza, że ​​adres URL jest zły, oznacza to, że strona nie jest dla Ciebie dostępna –

Odpowiedz

1

Ruby ma (przynajmniej) dwa moduły do ​​obsługi identyfikatorów URI.

URI jest częścią standardowej biblioteki.

Addressable::URI, to osobny klejnot, bardziej wszechstronny i zapewniający zgodność ze specyfikacją.

Przerób adres URL za pomocą jednego z nich, zmodyfikuj dowolne parametry za pomocą metod klejnotów, a następnie przekonwertuj je za pomocą to_s przed ich przekazaniem, a powinieneś być gotowy.

I tried ' open(URI.parse(URI.encode(a.authenticated_url())) ' but that errord with OpenURI::HTTPError: 403 Forbidden

Jeżeli do tej strony za pośrednictwem przeglądarki i to się udało, potem udało zamiar nim bezpośrednio za pomocą kodu, to prawdopodobnie nie jest ciasteczko sesji lub stan, że brakuje. Może być konieczne użycie czegoś takiego, jak Mechanize, które będzie utrzymywać ten stan, umożliwiając nawigację po witrynie.


EDIT:

require 'addressable/uri' 

url = 'http://www.example.com' 

uri = Addressable::URI.parse(url) 
uri.query_values = { 
    :foo => :bar, 
    :q => '"one two"' 
} 

uri.to_s # => "http://www.example.com?foo=bar&q=%22one%20two%22" 
+0

Dzięki Tin Man .. Kiedy "modyfikujesz jakiekolwiek parametry" możesz wyjaśnić, jeszcze lepiej podać przykład dla powyższego adresu URL? thxs – AnApprentice

+0

I dodałem prosty przykład użycia Addressable, a poza tym myślę, że musisz przejrzeć dokumenty, zdecydować, w jaki sposób pasuje do twojego przypadku użycia i poznać klejnot. Jest bardzo dobry. RI ma teraz pewien rosnący problem związany z kodowaniem parametrów, więc wszelkie manipulacje tą częścią adresu URL przechodzę do adresu. –

Powiązane problemy