2008-09-24 29 views
7

Tôi muốn một phương pháp được gọi là same_url? sẽ trả về true nếu URL được chuyển trong các URL bằng nhau. URL được chuyển trong URL có thể là tùy chọn thông số băm hoặc chuỗi.Cách tốt nhất trong Rails để xác định xem hai (hoặc nhiều) URL được cung cấp (như các chuỗi hoặc tùy chọn băm) có bằng nhau không?

same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true 

Các Rails Khung helper current_page? có vẻ như một điểm khởi đầu tốt nhưng tôi muốn vượt qua trong một số bất kỳ các URL.

Là một tiền thưởng thêm Sẽ tốt hơn nếu một hash của params để loại trừ từ sự so sánh có thể được thông qua vào Vì vậy, một lời gọi phương thức có thể trông giống như:.

same_url?(projects_path(:page => 2), "projects?page=3", :excluding => :page) # => true 
+0

Tôi nhận thấy trong ví dụ của bạn rằng bạn có một URL chuỗi được chuyển, nhưng bạn vẫn hy vọng tham số trang sẽ bị loại trừ. Tôi sẽ phân tích cú pháp này thành một băm bằng cách sử dụng mô-đun Định tuyến và chỉ hoạt động với các băm. – kch

Trả lời

1

Đây có phải là loại điều bạn' sau đó?

def same_url?(one, two) 
    url_for(one) == url_for(two) 
end 
5

Dưới đây là phương pháp (bung nó trong/lib và yêu cầu nó trong environment.rb):

def same_page?(a, b, params_to_exclude = {}) 
    if a.respond_to?(:except) && b.respond_to?(:except) 
    url_for(a.except(params_to_exclude)) == url_for(b.except(params_to_exclude)) 
    else 
    url_for(a) == url_for(b) 
    end 
end 

Nếu bạn đang ở trên Rails trước 2.0.1, bạn cũng cần phải thêm phương pháp except helper để Băm:

class Hash 
    # Usage { :a => 1, :b => 2, :c => 3}.except(:a) -> { :b => 2, :c => 3} 
    def except(*keys) 
    self.reject { |k,v| 
     keys.include? k.to_sym 
    } 
    end 
end 

phiên bản sau của Rails (tốt, ActiveSupport) bao gồm except đã (tín dụng: Brian Guthrie)

+0

Phiên bản mới hơn của Rails đã có trình trợ giúp bạn đã thực hiện ở trên (ngoại trừ); nó có thể là dư thừa để thêm lại nó. –

0
def all_urls_same_as_current? *params_for_urls 
    params_for_urls.map do |a_url_hash| 
    url_for a_url_hash.except(*exclude_keys) 
    end.all? do |a_url_str| 
    a_url_str == request.request_uri 
    end 
end 

Trong đó:

  • params_for_urls là một mảng băm của thông số url (mỗi mục mảng là params để xây dựng một url)
  • exclude_keys là một mảng các biểu tượng cho các phím mà bạn muốn để bỏ qua
  • request.request_uri có thể không chính xác những gì bạn nên sử dụng, xem bên dưới.

Sau đó, có tất cả các loại điều bạn sẽ muốn xem xét khi thực hiện phiên bản của bạn:

  • làm bạn muốn so sánh uri đầy đủ với tên miền, cổng và tất cả, hoặc chỉ con đường?
  • nếu chỉ là đường dẫn, bạn có muốn vẫn so sánh các đối số được chuyển sau dấu hỏi hay chỉ những đối tượng tạo đường dẫn thực tế không?
Các vấn đề liên quan