2015-01-13 11 views
11

Tôi vô cùng bối rối về một xung quanh. Họ làm việc như thế nào? Ai đó có thể vui lòng cung cấp cho tôi một ví dụ/giải thích về cách họ làm việc không?Gọi hàm around_action hoạt động như thế nào? Cần giải thích

Đây là trích dẫn từ cuốn sách 4 Agile Phát triển Web của tôi:

Khoảng callbacks quấn thực hiện hành động. Bạn có thể viết xung quanh gọi lại theo hai kiểu khác nhau. Đầu tiên, gọi lại là một đoạn mã duy nhất. Mã đó được gọi trước khi hành động được thực hiện. Nếu mã gọi lại gọi ra lợi nhuận, hành động được thực thi. Khi hành động hoàn tất, mã gọi lại tiếp tục thực hiện. Do đó, mã trước khi sản lượng giống như một lời gọi hành động trước và mã sau khi sản lượng là cuộc gọi lại sau hành động. Nếu mã gọi lại không bao giờ gọi năng suất. hành động không phải là chạy-điều này là giống như có một trở lại trước khi hành động gọi trở lại sai.

Tôi sắp xếp nó khi đọc. Dưới đây là ví dụ từ Hướng dẫn Rails

class ChangesController < ApplicationController 
    around_action :wrap_in_transaction, only: :show 

    private 

    def wrap_in_transaction 
    ActiveRecord::Base.transaction do 
     begin 
     yield 
     ensure 
     raise ActiveRecord::Rollback 
     end 
    end 
    end 
end 

Vậy điều gì đang xảy ra ở đây? Có ActiveRecord :: Base.transaction bắt đầu như là "trước" một phần và nâng cao ActiveRecord :: Rollback là "sau khi" một phần? Phương pháp này là gì? Nó là chương trình? Cuối cùng điều gì sẽ khiến phương thức lợi nhuận thất bại khiến toàn bộ cuộc gọi lại bị lỗi? Nó sẽ là kết xuất của hành động hiển thị? Tôi không hiểu. Xin vui lòng giúp đỡ.

Trả lời

10

hiểu biết của tôi là như sau:

begin 
    # Do before action... 
    logger.info 'I am the before action' 

    # Do the action, which is passed as a block to your "around filter" 
    # Note that if you were to delete this line, the action will never be called! 
    yield 

    # Do after action... 
    logger.info 'I am the after action' 
ensure 
    raise ActiveRecord::Rollback 
end 
10

Mấu chốt của around_callback là yield. Trong trường hợp của ví dụ wrap_in_transaction: lợi nhuận được thay thế bằng hành động show. Khi chương trình kết thúc (bao gồm kết xuất), wrap_in_transaction tiếp tục và thực hiện khôi phục.

Tại đường ray guides bạn có thể tìm thấy:

Ví dụ, trong một trang web nơi những thay đổi có sự chấp thuận workflow một quản trị viên có thể có thể xem trước chúng một cách dễ dàng, chỉ cần áp dụng chúng trong một giao dịch: ... Chú ý một bộ lọc xung quanh kết thúc tốt đẹp cũng hiển thị. Đặc biệt, nếu trong ví dụ trên quan điểm riêng của mình đọc từ cơ sở dữ liệu thông qua một phạm vi hoặc bất cứ điều gì, nó sẽ làm như vậy trong giao dịch và do đó trình bày các dữ liệu để xem trước."

Điều đó có nghĩa người dùng tại show lon xem thông tin trước khi khôi phục (trong trường hợp này là show phải đang thực hiện cập nhật sắp xếp cần khôi phục vì đó là một hành động thông tin)

Bạn có thể nghĩ rằng một xung quanh_callback là trước khi gọi lại và sau khi gọi lại chỉ có một phương pháp, sử dụng yield để đặt hành động ở giữa.

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