2011-01-19 56 views
5

tôi đã nhận như sau trở lại từ delayed_job:URI không hợp lệ - Cách ngăn chặn, URI :: Lỗi InvalidURIError?

[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 

Cách URI này xuất phát từ trong ứng dụng của tôi.

Trong user_mailer của tôi, tôi làm:

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

Sau đó, trong mô hình đính kèm của tôi:

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 

Nói như vậy, là có một số loại URI.encode hoặc phân tích cú pháp tôi có thể làm gì để ngăn chặn một URI hợp lệ (khi tôi kiểm tra URL hoạt động trong trình duyệt của tôi) để báo lỗi và giết chết delay_job trong đường ray 3?

Cảm ơn bạn!

+0

tôi đã cố gắng 'mở (URI.parse (URI.encode (a.authenticated_url()))' nhưng đó errord với OpenURI :: HTTPError: 403 Forbidden – AnApprentice

+0

lỗi đó không có nghĩa là URL là xấu, điều đó có nghĩa là trang không có sẵn cho bạn –

Trả lời

1

Ruby có (ít nhất) hai mô-đun để xử lý các URI.

URI là một phần của thư viện chuẩn.

Addressable::URI, là một viên ngọc riêng biệt, toàn diện hơn và tuyên bố phù hợp với thông số kỹ thuật.

Phân tích URL bằng một, sửa đổi bất kỳ tham số nào bằng phương pháp của đá quý, sau đó chuyển đổi thông số bằng cách sử dụng to_s trước khi truyền, và bạn nên làm tốt.

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

Nếu bạn điều hướng đến trang đó qua trình duyệt và thành công, sau đó không truy cập trực tiếp qua mã, có thể có cookie hoặc trạng thái phiên bị thiếu. Bạn có thể cần phải sử dụng một cái gì đó như Mechanize, sẽ duy trì trạng thái đó trong khi cho phép bạn điều hướng thông qua một trang web.


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

Cảm ơn Tin Man .. Khi bạn sửa đổi bất kỳ tham số nào bạn có thể giải thích, tốt hơn hãy cung cấp ví dụ cho URL ở trên? thxs – AnApprentice

+0

I thêm vào một ví dụ đơn giản về cách sử dụng Addressable, ngoài ra tôi nghĩ bạn cần phải xem qua các tài liệu, quyết định nó phù hợp với trường hợp sử dụng của bạn như thế nào, và tìm hiểu gem. RI có một số nỗi đau ngày càng tăng hiện nay liên quan đến mã hóa các tham số vì vậy bất kỳ thao tác nào của phần đó của URL tôi chuyển đến Địa chỉ. –

Các vấn đề liên quan