2009-12-13 23 views
8

Sử dụng Ruby on Rails, tôi muốn trước khi lọc một hành động nhưng chỉ khi người dùng đã đăng nhậpRuby on Rails: before_filter =>: only_when_user_is_logged_in

Làm thế nào có thể như vậy.?

+0

Tại sao vẫn còn tiền thưởng cho câu hỏi này. Ah, điều này thật tuyệt vời với tôi ngay bây giờ! – s84

Trả lời

16

Tôi nghĩ rằng bạn đang yêu cầu làm thế nào để chạy một trước khi lọc chỉ khi một người dùng được đăng nhập Không có built-in ngữ nghĩa cho điều này, nhưng nó đủ dễ dàng để nội tuyến:.

class SomeController < ApplicationController 
    before_filter :do_something 

    def do_something 
    if logged_in? 
     # the stuff you want to do 
    end 
    end 
end 
+0

Chính xác những gì tôi cần. – s84

+0

Có bị phản đối trong đường ray 4 không? – vishB

1

Nếu bạn đang sử dụng xác thực an toàn, chỉ cần before_filter :login_required. Nếu bạn đang sử dụng khung xác thực của riêng mình, bạn có thể tạo một phương thức trong application.rb trả về true nếu người dùng đăng nhập hoặc chuyển hướng đến trang đăng nhập nếu không.

18
before_filter :only_when_user_is_logged_in, :only => :the_action 

Hoặc cho nhiều

before_filter :only_when_user_is_logged_in, :only => [:the_action, :another_action] 

Ở bên flip, bạn cũng có thể cung cấp một tùy chọn :except => :this_action

+0

Đây là mẫu chuẩn, theo hướng dẫn của Rails: http://guides.rubyonrails.org/action_controller_overview.html#filters – clozach

2

Nếu bạn thực sự không muốn before_filter thực hiện cho bất cứ ai khác hơn là người dùng đăng nhập xem xét sử dụng #skip_before_filter trong bộ lọc xác thực của bạn. Ví dụ: nếu bạn đang kiểm tra xem người dùng có đăng nhập vào bộ lọc xác thực của bạn hay không, nếu xác thực không thành công, chỉ cần gọi skip_before_filter :filter_for_logged_in_users_only.

Ngoài ra, bạn có thể chỉ cần kiểm tra xem người dùng đã đăng nhập hay chưa trước khi thực hiện bộ lọc chỉ dành cho thành viên. Ví dụ:

def filter_for_logged_in_users_only 
    return true unless current_user && logged_in? 
    #rest of the logic 
end 
+0

nội dung hay. Cảm ơn – s84

11

Trước khi lọc lấy một khối tùy chọn định được thông qua bộ điều khiển dụ hiện vì vậy bạn có thể làm một cái gì đó như thế này:

before_filter :do_stuff, lambda { |controller| controller.logged_in? } 
0
class LoginsController < ApplicationController 

    skip_before_filter :require_login, :only => [:new, :create] 

end 
+0

Rất tiếc,
,   bên trong bộ điều khiển. Có thể bạn đang sử dụng trình soạn thảo được phát minh mới của riêng bạn. – Rubyist