2011-11-24 36 views
26

Cách tốt nhất để đẩy thông báo lỗi về chuyển hướng đến là gì?Truyền thông báo lỗi qua flash

Trước đây tôi đã sử dụng một vài cách tiếp cận, nhưng cả hai đều có vấn đề.

(1) Đi qua toàn bộ đối tượng với lỗi trên flash và sử dụng error_messages_for:

def destroy 
    if @item.destroy 
     flash[:error_item] = @item 
    end 
    redirect_to some_other_controller_path 
    end 

tôi thấy rằng phương pháp này gây tràn cookie.

(2) Đi qua một thông báo lỗi duy nhất:

def destroy 
    if @item.destroy 
     flash[:error] = @item.full_messages[0] 
    end 
    redirect_to some_other_controller_path 
    end 

Bằng cách này tôi chỉ gửi một thông báo lỗi duy nhất, những gì nếu có nhiều? Có ai biết cách nào tốt hơn không?

Trả lời

61

Trước tiên, bạn có thể đạt được những gì bạn đang cố gắng làm bằng cách đặt một câu duy nhất.

flash[:error] = @item.errors.full_messages.to_sentence 

Tôi nghĩ bạn cũng có thể đặt làm mảng mà không làm tràn cookie.

flash[:error] = @item.errors.full_messages 

Nhưng như những người khác nói, flash thường được sử dụng để trả lại các thư cụ thể.

ví dụ:

flash[:error] = "We were unable to destroy the Item" 

Mẫu chung là như vậy.

def some_action 
    if @record.action 
    flash[:notice] = "Action performed successfully" 
    redirect_to @record  
    else 
    flash[:error] = "Action failed" 
    render :action => "some_action" 
    end 
end 

Cụ thể, chúng tôi có hai đường dẫn.

  1. Hành động thành công. Chúng tôi chuyển hướng.
  2. Hành động không thành công. Chúng tôi hiển thị một trang, nhấp nháy lỗi và có @record.errors trên tay để gọi error_messages_for(@record) nếu chúng tôi muốn.
+0

Chắc chắn sẽ giúp! Cảm ơn! – alexs333

+2

Đối với phần 'khác' trong ví dụ của bạn, bạn nên sử dụng 'flash.now [: error] =" Hành động không thành công "' Xem: [the-flash] (http://guides.rubyonrails.org/action_controller_overview .html # the-flash) – Joris

0

Kể từ đèn flash [: lỗi] là một hash, bạn có thể vượt qua các thông báo lỗi để nó với một "< <" hành

2

Flash là một phần của phiên Rails được xóa trong yêu cầu và Rails phiên được thực hiện sử dụng cookie. (ít nhất là cho đến Rails-2). Cookies thường được sử dụng để lưu trữ số lượng dữ liệu rất tối thiểu là số tiền tối đa mà cookie mặc định có thể lưu trữ là 4 kbs tôi nghĩ. Vì vậy, lưu trữ toàn bộ các đối tượng mô hình có thể không phải là một lựa chọn rất tốt. Để làm điều đó, bạn có thể sử dụng một kho lưu trữ cookie khác cho phép bạn lưu trữ lượng lớn dữ liệu.

Đối với vấn đề thứ hai, bạn có thể lưu trữ nhiều thông báo lỗi trong biến flash. Cách bạn đã thực hiện flash[:error], bạn có thể thực hiện tương tự và lưu trữ các thư khác cũng như sử dụng các phím khác để lưu trữ các thư khác.

Hy vọng điều này sẽ hữu ích.

2

Đây là những gì làm việc cho tôi:

@item.errors.messages.map { |k,v| v }.join('<br>').html_safe 
+0

Điều này phải được đánh dấu là câu trả lời theo ý kiến ​​của tôi. –

+0

Sử dụng 'html_safe' ở đây có thể không an toàn (mở cho XSS) tùy thuộc vào cách thông báo lỗi của bạn được tạo ra. Sử dụng hết sức thận trọng ... – PinnyM

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