2011-09-21 32 views
34

Đối với mã bên dưới, điều gì sẽ xảy ra nếu thay thế redirect_to bằng kết xuất hoặc vise?Chuyển hướng_to và hiển thị có thể trao đổi không?

def create 
    @product = Product.new(params[:product]) 

    respond_to do |format| 
    if @product.save 
     format.html { redirect_to(@product, :notice => 'Product was successfully created.') } 

    else 
     format.html { render :action => "new" } 
    end 
    end 
end 

Có vẻ như OK thay thế một với người kia trong mã ở trên. Có một nơi mà chỉ redirect_to hoặc render phải được sử dụng? Render không làm gì ngoài việc hiển thị một khung nhìn. Redirect_to gửi 302 yêu cầu đến máy chủ và các thông số hiện tại bị mất sau khi chuyển hướng.

Cảm ơn.

Trả lời

98

Nếu bạn đang sử dụng render, khi người dùng làm mới trang , nó sẽ gửi lại yêu cầu POST trước đó. Điều này có thể gây ra các kết quả không mong muốn như mua hàng trùng lặp và các kết quả khác.

enter image description here

Nhưng nếu bạn đang sử dụng redirect_to, khi người dùng làm mới trang, nó sẽ chỉ yêu cầu cùng một trang một lần nữa. Điều này còn được gọi là mẫu Post/Redirect/Get (PRG).

enter image description here

Vì vậy, nơi redirect_to nên được sử dụng là khi bạn đang làm một yêu cầu HTTP POST và bạn không muốn người dùng gửi lại yêu cầu khi nó được thực hiện (có thể khiến các mục trùng lặp và khác các vấn đề).

Trong Rails, khi không thể lưu mô hình, render được sử dụng để hiển thị lại biểu mẫu có cùng mục nhập đã được điền trước đó. Điều này đơn giản hơn vì nếu bạn sử dụng chuyển hướng, bạn sẽ phải chuyển các mục nhập biểu mẫu bằng cách sử dụng các tham số hoặc phiên. Tác dụng phụ là nếu bạn làm mới trình duyệt, nó sẽ cố gắng gửi lại các mục nhập biểu mẫu trước đó. Điều này là chấp nhận được bởi vì nó có thể sẽ không theo cùng một cách, hoặc nếu nó thành công bây giờ, đó là những gì người dùng nên mong đợi ở nơi đầu tiên anyway.

Để được giải thích chi tiết hơn về renderredirect, bạn nên đọc số này article.

+0

Cảm ơn. Đây là một lời giải thích kỹ lưỡng. – user938363

+0

Tôi không nghĩ rằng tôi đã nhìn thấy một lời giải thích hoàn hảo hơn, đặc biệt là kết thúc với TẠI SAO nó quan trọng với sự khác biệt thực tế sử dụng trường hợp ở cuối. – ahnbizcad

+2

Lưu ý: làm mới là * không * giống như việc nhấn enter trong thanh URL.Nhấn enter trong thanh URL chỉ gửi yêu cầu GET đến URL đó. Làm mới gửi lại yêu cầu cuối cùng (mà trình duyệt theo dõi). –

9

Khi bạn chuyển hướng, bạn sẽ tạo một yêu cầu mới truy cập phương thức bộ điều khiển, hiển thị chỉ hiển thị chế độ xem được liên kết. Bạn sử dụng kết xuất trong tạo vì bạn muốn giữ trạng thái của đối tượng mô hình nếu lưu không thành công để bạn có thể hiển thị thông tin về lỗi của nó. Nếu bạn đã cố gắng để chuyển hướng đến con đường new_product bạn sẽ tạo ra một đối tượng mới mô hình và lỏng tất cả các dữ liệu hình thức người dùng nhập và bất kỳ lỗi vv vv

EDIT (với một số thông tin hơn):

Một ví dụ về tình huống mà bạn PHẢI sử dụng redirect_to là nếu mẫu xem của bạn sử dụng các biến mẫu không được khởi tạo trong phương thức bộ điều khiển mà bạn đang chuyển hướng từ đó. Vì vậy, bạn có lẽ không thể gọi render {:action => 'index'} trong phương pháp tạo của bạn bởi vì các mẫu chỉ số có thể làm cho việc sử dụng một biến @products nhưng bạn chỉ khởi @product vì vậy nó sẽ gây ra một ngoại lệ

+0

Có vẻ như kết xuất được an toàn để sử dụng ở nhiều nơi hơn. Có nơi nào mà redirect_to phải được sử dụng không? Cảm ơn. – user938363

+0

Xem phần chỉnh sửa ở trên để có ví dụ – Matthew

+0

Cảm ơn câu trả lời. – user938363

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