2011-01-22 33 views
30

Trong bộ điều khiển tài khoản của tôi, tôi muốn hiển thị (render, redirect_to?) Chế độ xem chỉnh sửa sau khi thay đổi được lưu và hiển thị thông báo flash.Cách hiển thị chế độ xem chỉnh sửa và thông báo đèn flash trong rails3

def update 
    @account = Account.find(params[:id]) 

    respond_to do |format| 
     if @account.update_attributes(params[:account]) 
     format.html { redirect_to(@account, :notice => 'Account was successfully updated.') } 

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

Trả lời

11

Bạn vẫn có thể sử dụng các thông báo như trong Rails 2:

flash[:notice] = "message" 

Chỉ cần thêm dòng sau vào phía trên cùng của cái nhìn của bạn để hiển thị nó:

<p id="notice"><%= flash[:notice] %></p>

Và bạn nên sử dụng phương pháp render nếu bạn không muốn làm cho người dùng của mình điền vào các biểu mẫu chỉnh sửa một lần nữa.

+0

Tôi không hiểu chú thích cuối cùng của bạn. Đó là tiêu chuẩn để 'redirect_to' sau khi cập nhật, do đó trình duyệt Làm mới không gửi lần thứ hai. Các "điền vào các hình thức chỉnh sửa một lần nữa" phần confuses tôi. – timkay

+0

Thực ra đó là sai lầm của tôi, trong trường hợp của bạn thực sự không có sự khác biệt giữa các phương pháp đó. Vì vậy, sử dụng bất cứ điều gì bạn muốn. –

+0

@timkay nhưng đừng quên rằng 'render' và' redirect_to' là các phương thức hoàn toàn trì hoãn. Đọc [Rails Guides on Rendering] (http://guides.rubyonrails.org/layouts_and_rendering.html) để biết thêm thông tin. –

43

Theo mặc định, bạn phải sử dụng một câu lệnh riêng biệt, ví dụ:

format.html { 
    flash[:notice] = 'message' 
    render :edit 
} 

This ticket có bản vá để bạn sử dụng render 'edit', :notice => 'message'. Nó không đi vào Rails nhưng có một viên đá quý, flash_render, thêm nó.

+1

Nếu bạn đang sử dụng 'render' (trái ngược với' redirect_to'), bạn thường muốn sử dụng 'flash.now'. Tôi giải thích lý do tại sao chi tiết trong [bài đăng trên blog này] (http://ryanlue.com/posts/2017-08-24-rails-render#implications-for-flash). –

9

Nếu bạn chỉ sử dụng flash[:notice], giá trị đó sẽ vẫn có sẵn trong yêu cầu tiếp theo. Có nghĩa là, bạn sẽ thấy văn bản trên 2 trang tiếp theo. Thay vào đó, hãy sử dụng flash.now để chỉ làm cho giá trị có sẵn trong yêu cầu hiện tại.

format.html { 
    flash.now[:notice] = 'message' 
    render :edit 
} 

Để tham khảo đọc Action Controller Overview 5.2.1

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