2009-07-16 11 views
20

Tôi có yêu cầu chỉ định tuyến đường được đặt tên trong dự án Ruby on Rails trả về trang công cộng/404.html cùng với mã phản hồi máy chủ 404.Cách đơn giản nhất để xác định tuyến đường trả lại 404

Để trống nó không phải là một tùy chọn, vui lòng không hỏi tại sao, nó chỉ là :) Nó hoàn toàn phải là một tuyến đường được đặt tên, hoặc một mục nhập map.connect sẽ làm.

Something như thế này sẽ là tuyệt vời:

map.my_named_route '/some/route/', :response => '404'

Bất cứ ai có bất cứ ý tưởng cách dễ nhất để làm điều gì đó như thế này là những gì. Tôi có thể tạo ra một phương pháp điều khiển mà ám tập tin 404.html nhưng nghĩ rằng có thể có một cách sạch hơn hiện có để làm điều này. Mong muốn được bất kỳ phản ứng - cảm ơn,

Eliot

Trả lời

39

Bạn có thể đường đến một endpoint rack (đường ray 3) mà vends một đơn giản 404:

match 'my/route', to: proc { [404, {}, ['']] } 

Điều này đặc biệt tiện dụng, ví dụ, để xác định một con đường được đặt tên để omniauth endpoint của bạn:

match 'auth/:action', to: proc { [404, {}, ['']] }, as: :omniauth_authorize 
+0

Đây là cách tiếp cận tốt cho bất kỳ phản hồi nào không cần bộ điều khiển. Nó vẫn còn kém hiệu quả hơn so với thực hiện điều này trong Apache/nginx. – mmell

+7

Trong Rails 4, hãy sử dụng tùy chọn: to, ví dụ: 'get '/ apple-touch * str', tới: proc {[404, {}, ['']]}' – mmell

+1

@mmell Điều đó không có tác dụng, bạn phải làm điều này: 'get '/: str' , tới: proc {[404, {}, ['']]}, các ràng buộc: {str:/apple-touch. * /} ' – Amala

2

Tại sao không bạn làm điều này trong Apache/nginx nơi bạn sử dụng mod_rewrite (hoặc tùy ý nginx không được ghi đè) để liên kết đến một trang không tồn tại hoặc thay vì gửi 410 (Đã qua rồi, không còn tồn tại) Cờ?

Dù sao, nếu bạn muốn đường ray ứng dụng để làm điều này, tôi nghĩ rằng cách này là như bạn đề nghị, tạo ra một con đường được đặt tên cho một hành động mà không một render(:file => "#{RAILS_ROOT}/public/404.html", :status => 404)

3

Trong routes.rb của bạn:

map.my_404 '/ohnoes', :controller => 'foobar', :action => 'ohnoes' 

Trong FoobarController:

def ohnoes 
    render :text => "Not found", :status => 404 
end 

Nếu bạn cần phải làm cho cùng một tập tin 404 như bình thường 404, bạn có thể làm điều đó với render :file.

Xem ActionController::Base tài liệu để biết ví dụ.

1

Phiên bản ngắn hơn so với các câu trả lời trước cho 404 bất kỳ được nhận trong một dòng. get '*_', to: ->(_) { [404, {}, ['']] }