2010-11-17 22 views
6

Tôi sắp gặp một trong những khoảnh khắc đó khi làm việc với Rails khi tôi cảm thấy rằng phải có một cách tốt hơn những gì tôi đang kết thúc.Làm thế nào tôi có thể duy trì các giá trị chuỗi truy vấn trên các yêu cầu trong Ruby on Rails?

Tôi có bốn tham số chuỗi truy vấn mà tôi muốn giữ lại trên các yêu cầu thông qua các phần khác nhau của ứng dụng đường ray - các bộ điều khiển và hành động khác nhau, một số được hiển thị qua javascript - để người dùng kết thúc tại URL có cùng tham số truy vấn bắt đầu với.

Tôi rất khó tin rằng cách tốt nhất là thông qua các trường biểu mẫu ẩn và thêm các tham số theo cách thủ công như một phần của redirect_to hoặc sử dụng các phiên vars cho mỗi trường - nó dường như không có đường ray như thế nào.

Có ai biết cách nào tốt hơn để quản lý việc này không?

Cảm ơn!

+0

Tại sao không đặt chúng trong phiên? Bạn có thể nói thêm một chút về những gì họ đang làm hay không và tại sao việc đưa họ vào phiên làm việc hoặc trong cơ sở dữ liệu không hiệu quả với bạn? – PreciousBodilyFluids

+0

Nó không phải là quá nhiều mà nó không hoạt động, nó chỉ là tôi ngạc nhiên rằng không phải là một số Rails lòng tốt mà làm cho điều đó không cần thiết. Theo như chi tiết cụ thể của những gì tôi đang làm, tôi đang lưu một mục từ một biểu mẫu trong lớp phủ jQuery (được hiển thị bằng chế độ xem đường ray) và sau khi lưu, tôi muốn người dùng xem trang dựa trên cùng thông số khi họ rời khỏi nó. Các tham số dành cho cấu hình chế độ xem ngày và ứng dụng cụ thể. – evanmcd

Trả lời

5

Trong trường hợp như thế này, tôi thường sử dụng hàm trợ giúp để tạo các url dựa trên tập hợp các tham số hiện tại. Nói cách khác, tôi muốn xác định điều này:

def merge_params(p={}) 
    params.merge(p).delete_if{|k,v| v.blank?} 
end 

Sau đó sử dụng url này để tạo url cho biểu mẫu và liên kết của bạn. Nếu bạn cần phải sửa đổi và các params, chỉ cần chuyển chúng vào việc hợp nhất:.

# url for the current page 
url_for(merge_params) 

# url for a different action 
url_for(merge_params(:controller => 'bar', :action => 'bar')) 

# et cetera 
url_for(merge_params(:action => 'pasta', :sauce => 'secret')) 

này sẽ duy trì params hiện cộng với bất cứ đè bạn hợp nhất trong

2

Nếu bạn muốn luôn duy trì các thông số nhất định accross mỗi URL được tạo, bạn có thể triển khai phương thức default_url_parameters trong ứng dụng của mình.

này chưa được ghi nhận, nhưng mentioned in the Rails 18n Guide

Thực hiện trong application_controller.rb của bạn:

def default_url_options(*args) 
    super.merge(
    :foo = params[:foo], 
    :bar = params[:bar] 
) 
end 

Bây giờ mỗi URL được tạo ra bởi Rails sẽ bao gồm các giá trị yêu cầu hiện tại cho foobar (trừ khi một url là được tạo ra để xác định cụ thể những thứ khác).

+0

Điều này sẽ không hoạt động .. có một lỗi trong mã = ​​nên được => và vẫn còn nó không hoạt động .. ngay cả khi sử dụng đường ray tên là đường dẫn Tôi có một chức năng jquery tại chỗ mà hoạt động trên vài trang nhưng không phải tất cả. – whizcreed

-1

Xin lưu ý đây không phải là giải pháp đường ray nhưng hoạt động với tôi trong 80% trường hợp. Đây là cách tôi có thể đạt được điều này với jQuery, rõ ràng không phải là cách tiếp cận tốt nhất. Và tôi không thể làm cho nó hoạt cấp 2 qua các liên kết:

function mergeGPS(){ 
    var lat = getParam('lat');//localStorage.getItem('lat'); 
    var lng = getParam('lng');//localStorage.getItem('lng'); 
    if(lat == null || lng == null){return false;} 
    var links = jQuery("a"); 
    jQuery.each(links, function(y, lnk){ 
     //debugger; 
    var uri = jQuery(lnk).attr('href') + "?lat="+lat+"&lng="+lng; 
    jQuery(lnk).attr('href',uri); 
    //debugger; 
    }) 
} 

function getParam(name) { 
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 
     results = regex.exec(location.search); 
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 
} 

mergeGPS cần phải được gọi vào tải trang.

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