2012-03-28 38 views
7

tôi viết một before_filter như thế này:cách đối phó với một cuộc gọi ajax trong before_filter

def authenticate_user 
    if request.xhr? 
    flash.now[:alert] = 'Error' 
    render :partial => "js_helpers/popover", :formats => :js 
    else 
    authenticate_user! 
    end 
end 

Tuy nhiên, nó không hoạt động như mong đợi. Tệp nhật ký hiển thị:

Rendered js_helpers/_popover.js.erb (0.1ms) 
Filter chain halted as :authenticate_user rendered or redirected 

Chức năng mã js là hiển thị khối bật lên hiển thị thông báo flash. nhưng có vẻ như mã js không hề vui mừng chút nào.

Vì vậy, tôi đã thay đổi cách của tôi:

def authenticate_user 
    if request.xhr? 
    flash.now[:alert] = 'Error' 
    render :js => "window.location = '/users/sign_up'" 
    else 
    authenticate_user! 
    end 
end 

Thay vào đó, tôi muốn chuyển hướng đến trang đăng ký.

Tuy nhiên, vẫn còn vấn đề. đèn flash dường như không hoạt động

Làm thế nào tôi có thể đạt được mục tiêu của tôi:

khi yêu cầu là một cuộc gọi ajax, thực hiện đến mã javascript hay redirect_to một trang mới. Trong cả hai điều kiện, tôi cần lưu trữ một số tin nhắn trong nháy mắt.

Ngoài ra, mã javascript rất dài nên tôi cần phải đặt nó vào một tệp. Làm thế nào tôi có thể sử dụng render: js để thực thi một javascript bên trong một tệp?

Trả lời

1

Tôi nghĩ rằng thay vì cố gắng hiển thị mã javascript cho máy khách để thực thi, bạn nên trả về phản hồi json mà khách hàng của bạn sẽ hiểu.

def authenticate_user 
    if request.xhr? 
    render :json => { alert: 'Error', redirect: sign_up_path }, :status => 403 
    else 
    authenticate_user! 
    end 
end 

Trong cuộc gọi ajax, hãy bẫy mã trạng thái 403, hiển thị thông báo cảnh báo và chuyển hướng đến url đã cho. Bạn sẽ có thể thực hiện điều này một móc tiêu chuẩn cho một 403 (hoặc bất kỳ mã trạng thái có vẻ thích hợp nhất) để nó có thể được như DRY như before_filter.

0

Tôi nghĩ rằng việc sử dụng chuyển hướng được tích hợp của đường ray là những gì bạn đang tìm kiếm.

def authenticate_user 
    if request.xhr? 
    flash[:alert] = 'Error' 
    redirect_to user_sign_up 
    else 
    authenticate_user! 
    end 
end 

này nên chuyển hướng và điền thông tin vào tin nhắn nhấp nháy

Dưới đây là các ví dụ từ rails guides

+0

Các đường ray tiêu chuẩn chuyển hướng sẽ không hoạt động trên một cuộc gọi AJAX. – sockmonk

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