2013-02-02 25 views
22

Tôi biết tôi có thể sử dụng request.referrer để nhận URL yêu cầu đầy đủ trong Rails, nhưng có cách nào để lấy tên bộ điều khiển từ yêu cầu không?Cách tốt để lấy tên bộ điều khiển từ một request.referer trong Rails

Tôi muốn nhìn thấy nếu URL của http://myurl.com/profiles/2 bao gồm "hồ sơ"

Tôi biết tôi có thể sử dụng một regex để làm điều đó nhưng tôi tự hỏi nếu có một cách tốt hơn.

+0

nó dường như không phải là một cách tiếp cận đúng chút nào. Điều gì sẽ xảy ra nếu một số máy chủ khác là liên kết giới thiệu? – Eru

+1

http: // localhost: 3000 ok test guys thanks thanks :) –

+0

Vui lòng @ tvalent2, chọn lại câu trả lời đúng. Các upvotes nói một mình. –

Trả lời

-2

Bên trong bộ điều khiển, bạn có phương thức controller_name chỉ trả về tên của bạn. Trong trường hợp của bạn, nó sẽ trả về "hồ sơ". Bạn cũng có thể sử dụng params[:controller] trả về cùng một chuỗi.

+15

Câu hỏi này có được chấp nhận không chính xác không? Anh ta không muốn biết cách phân hủy hành động/bộ điều khiển của liên kết giới thiệu chứ không phải hành động hiện tại? – GigaBass

82

Hãy nhớ rằng request.referrer cung cấp cho bạn url của yêu cầu trước yêu cầu hiện tại. Điều đó nói rằng, đây là cách bạn có thể chuyển đổi request.referrer để điều khiển/thông tin actionn:

Rails.application.routes.recognize_path(request.referrer) 

nó sẽ cho bạn một cái gì đó giống như

{:controller => "x", :action => "y"} 
+1

Thiên tài. Cảm ơn. – Abram

+4

'Rails.application.routes.recognize_path (request.referrer) [: controller]' là chính xác. – marcantonio

+2

Cảm ơn rất nhiều, Bạn đã tiết kiệm thời gian của tôi. –

4

Đây là cố gắng của tôi mà làm việc với Rails 3 & 4. Mã này trích xuất một tham số khi đăng xuất và chuyển hướng người dùng đến trang đăng nhập tùy chỉnh nếu không nó chuyển hướng đến trang đăng nhập chung. Bạn có thể dễ dàng trích xuất :controller theo cách này. Điều khiển phần:

def logout 
    auth_logout_user 
    path = login_path 
    begin 
    refroute = Rails.application.routes.recognize_path(request.referer) 
    path = subscriber_path(refroute[:sub_id]) if refroute && refroute[:sub_id] 
    rescue ActionController::RoutingError 
    #ignore 
    end 
    redirect_to path 
end 

Và kiểm tra rất quan trọng cũng như:

test "logout to subscriber entry page" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "http://host/s/client1/p/xyzabc" 
    get :logout 
    assert_redirected_to subscriber_path('client1') 
end 

test "logout other referer" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "http://anyhost/path/other" 
    get :logout 
    assert_redirected_to login_path 
end 

test "logout with bad referer" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "badhost/path/other" 
    get :logout 
    assert_redirected_to login_path 
end 
+0

woot woot cho TDD trên một câu trả lời! –

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