2012-06-27 29 views
8

Tôi có hành động 'phê duyệt' hiển thị một chế độ xem hiển thị một số nội dung từ Mô hình (lớp). Trong chế độ xem, tôi có một liên kết_to gọi accept với tham số URL (: id). Sau khi hoàn thành hành động accept (bộ phê duyệt thành true) tôi muốn hiển thị lại approval bằng một thông báo ("Đã lưu!"). Tuy nhiên, không giống như trang đăng nhập tĩnh, hành động phê duyệt yêu cầu thông số lần đầu tiên được gọi. Lần thứ hai nó được trả lại, một lỗi thời gian chạy xảy ra (rõ ràng). Cách tốt nhất để gọi approval bằng thông báo flash là gì?Hiển thị hành động với: thông báo phụ thuộc vào thông số URL

def approval 
    @c = Class.find(params[:id]) 
end 


def accept 
    @c = Class.find(params[:id]) 
    @c.approve = true 
    @c.save 

    render 'approval', :notice => "Saved!" 
end 
+0

Runtime lỗi do id không được đưa vào tìm @c trong lần thứ hai. Vì vậy, bạn có thể vượt qua id. –

Trả lời

7

thay đổi này render 'approval', :notice => "Saved!" để

flash[:notice] = "Saved!" 
redirect_to :back 
+0

Điều gì: ngược lại đại diện? –

+0

: quay lại - Quay lại trang đã đưa ra yêu cầu. Hữu ích cho các biểu mẫu được kích hoạt từ nhiều nơi. Short-hand cho redirect_to (request.env ["HTTP_REFERER"]) – abhas

1

Exceprt từ: http://www.perfectline.ee/blog/adding-flash-message-capability-to-your-render-calls-in-rails

Bây giờ mô hình phổ biến ở các bộ điều khiển trông như thế này:

if @foo.save 
    redirect_to foos_path, :notice => "Foo saved" 
else 
    flash[:alert] = "Some errors occured" 
    render :action => :new 
end 

Những gì tôi muốn để có thể làm như sau:

if @foo.save 
    redirect_to foos_path, :notice => "Foo saved" 
else 
    render :action => :new, :alert => "Some errors occured" 
end 

Việc thêm chức năng này thực sự khá đơn giản - chúng tôi chỉ phải tạo một số mã mở rộng hàm render. Đoạn mã tiếp theo này thực sự mở rộng mô-đun có chứa chức năng cho các cuộc gọi chuyển hướng.

module ActionController 
    module Flash 

    def render(*args) 
     options = args.last.is_a?(Hash) ? args.last : {} 

     if alert = options.delete(:alert) 
     flash[:alert] = alert 
     end 

     if notice = options.delete(:notice) 
     flash[:notice] = notice 
     end 

     if other = options.delete(:flash) 
     flash.update(other) 
     end 

     super(*args) 
    end 

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