2009-03-21 22 views
11

Khi kết thúc một trong các hành động điều khiển của tôi, tôi cần chuyển hướng đến một trang chỉ chấp nhận các yêu cầu đặt. Tôi đã cố gắng tìm ra cách để có được redirect_to để sử dụng một yêu cầu đặt nhưng không thành công.Làm cách nào để bạn có thể chuyển hướng_để sử dụng một yêu cầu HTTP khác?

Điều này có khả thi không? Hay có cách nào khác để thực hiện điều này?

Trả lời

2

Ok, vì vậy tôi đã tìm thấy giải pháp cho vấn đề của mình. Tôi tìm thấy rất tốt viết về tình hình here. thực hiện của tôi trông như thế này:

private 
def redirect_post(redirect_post_params) 
    controller_name = redirect_post_params[:controller] 
    controller = "#{controller_name.camelize}Controller".constantize 
    # Throw out existing params and merge the stored ones 
    request.parameters.reject! { true } 
    request.parameters.merge!(redirect_post_params) 
    controller.process(request, response) 
    if response.redirected_to 
    @performed_redirect = true 
    else 
    @performed_render = true 
    end 
end 

Sau đó, tôi gọi phương pháp này như sau:

redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token] 

Vì vậy, tôi đã có thể yêu cầu đặt 'giả' bằng cách làm cho một yêu cầu bài (sử dụng redirect_post) và sau đó gán 'đặt' cho thông số _method. Nếu bạn xem xét yêu cầu put bình thường, tất cả là post từ biểu mẫu có thông số _method. Vì vậy, một chút hackish của nó, nhưng nó được công việc làm.

Ngoài ra, bạn phải đảm bảo rằng khi bạn gọi redirect_post giá trị của băm của bạn là các chuỗi nếu không thì các lỗi sẽ bị ném.

+1

'controller.process' không hoạt động nữa trong thanh ray 4 – josal

1

Bạn có thể chuyển hướng đến một trang khác đưa ra yêu cầu đặt từ ứng dụng khách, using Javascript.

5

Tôi không nghĩ rằng bạn có thể thực hiện việc này và tôi nghi ngờ rằng giới hạn là một phần của chính HTTP.

Khi sử dụng redirect_to - chuyển hướng xảy ra dưới dạng tiêu đề "Đã di chuyển 302" trừ khi có quy định khác trong thông số.

Việc xem chính HTTP Spec không tiết lộ bất kỳ cách nào để thay đổi loại yêu cầu mà trình duyệt thực hiện thông qua chuyển hướng.

HTTP Redirects:

Lớp này của mã trạng thái chỉ ra rằng hành động tiếp theo cần phải được thực hiện bởi user agent để thực hiện yêu cầu. Hành động được yêu cầu MAY được thực hiện bởi tác nhân người dùng mà không tương tác với người dùng nếu và chỉ khi phương pháp được sử dụng trong yêu cầu thứ hai là yêu cầu thứ hai là GET hoặc HEAD.

Tôi nghĩ bạn có thể cần sử dụng JavaScript để đạt được chức năng này hoặc có thể suy nghĩ lại luồng kiểm soát trong ứng dụng của bạn.

2

Nếu hành động trong bộ điều khiển tương tự như nơi bạn đang cố gắng để chuyển hướng từ, chỉ cần gọi hành động và đưa ra các mẫu như sau:

def show 
    index 
    render :action => "index" 
end 

Nếu không, sau đó tôi không biết làm thế nào bạn làm điều đó.

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