2010-09-04 40 views
20

Tôi có đoạn mã sau đâyLàm thế nào để ngăn chặn một bộ điều khiển đường ray thực hiện?

def show 
    unless logged_in? 
     login_required 
     return 
    end 
    #some additional code 
    #that should only execute 
    #if user is logged in 
end 

Điều này hoạt động hoàn hảo. Bây giờ tôi muốn di chuyển kiểm tra đăng nhập vào một bộ lọc trước. Vấn đề là, khi tôi trở về từ một phương thức bên ngoài chương trình, nó không dừng việc thực hiện chương trình ... làm thế nào để tôi dừng lại show từ việc thông qua mã từ một phương thức bên ngoài (tức là một phương thức có thể được gọi là từ một bộ lọc trước)?

Cảm ơn!

Trả lời

16

Nếu bạn trả về false từ before_filter, thì việc thực hiện yêu cầu sẽ dừng ngay lập tức.

Nếu bạn chỉ làm cho phương thức login_required của bạn trả về false (hoặc redirect) nếu chúng không đăng nhập và làm cho nó trả về true nếu đúng, thì chỉ before_filter :login_required, nó sẽ hoạt động hoàn hảo.

Edit: Theo Lenry khẳng định dưới đây, điều này sẽ không làm việc trong Rails 2.0.1+ Thay vào đó, để ngăn chặn việc sử dụng yêu cầu head :ok trong mã của bạn

+0

làm việc một cách hoàn hảo. cảm ơn bạn! –

+0

Điều này không còn giá trị. Kiểm tra câu trả lời từ Lenny bên dưới. – tdgs

17

Trong ray phiên bản 2.0.1 trở lên, bạn cần phải chuyển hướng hoặc gửi phản hồi để tạm dừng thực hiện tác vụ.

Từ Agile Web Development with Rails Errata:

# 45840: Sau đây là đúng:.

"Nếu trước khi lọc trả về false, xử lý các chấm dứt chuỗi bộ lọc, và hành động không chạy Một bộ lọc có thể cũng đưa ra các yêu cầu đầu ra hoặc chuyển hướng, trong trường hợp đó hành động ban đầu không bao giờ được gọi. "

Một before_filter không ngừng xử lý chuỗi bộ lọc trên trả về false nữa.

Từ ghi chú phát hành của Rails 2.0.1: * Thay đổi before_filter ngăn chặn để xảy ra tự động trên render hay chuyển hướng nhưng không còn trên chỉ đơn giản là trả về false [David Heinemeier Hansson]

--Rob Christie

redirect_to, renderhead sẽ ngừng thực thi. Ví dụ: head :ok sẽ chỉ phản hồi yêu cầu với mã phản hồi HTTP OK và hành động sẽ không thực thi.

+6

Trừ khi lệnh 'render' nằm trong chuỗi lọc, lệnh gọi' render' * sẽ không * ngừng thực hiện tác vụ bộ điều khiển. (http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors) – pje

+3

Nếu hiển thị tạm dừng thực thi, tại sao bạn gặp lỗi kết xuất kép nếu bạn hiển thị hai lần? – Mohamad

+4

Sự khác biệt quan trọng ở đây là 3 phương thức này phải được gọi từ 'before_filter' để dừng thực hiện. – maletor

1

Để ngăn chặn chuỗi callback trong Rails 5 bạn có thể sử dụng

throw :abort 
+3

Tôi không hiểu vị trí tốt nhất ở đâu, để 'nắm bắt' biểu tượng được ném này.Nếu tôi muốn giới thiệu một số logic chung cho tất cả các bộ điều khiển, điều đó ngăn cản việc xử lý tiếp tục, và tôi ném ': abort' trong' ApplicationController', tôi bắt nó ở đâu? – sameers

+0

thow: hủy bỏ chỉ dành cho xác thực mô hình và không phải là Bộ điều khiển. – bkunzi01

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