routes: add a new 404 page.
* Fix a bug where non-GET 404 requests weren't handled. * Fix a bug where non-HTML 404 requests weren't handled. * Show a random image from a specified pool on the 404 page.
This commit is contained in:
@@ -124,17 +124,17 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_error_page(status, exception, message: exception.message, template: "static/error", format: request.format.symbol)
|
def render_error_page(status, exception = nil, message: exception.message, template: "static/error", format: request.format.symbol)
|
||||||
@exception = exception
|
@exception = exception
|
||||||
@expected = status < 500
|
@expected = status < 500
|
||||||
@message = message.encode("utf-8", invalid: :replace, undef: :replace)
|
@message = message.encode("utf-8", invalid: :replace, undef: :replace)
|
||||||
@backtrace = Rails.backtrace_cleaner.clean(@exception.backtrace)
|
@backtrace = Rails.backtrace_cleaner.clean(@exception.backtrace) if @exception
|
||||||
format = :html unless format.in?(%i[html json xml js atom])
|
format = :html unless format.in?(%i[html json xml js atom])
|
||||||
|
|
||||||
# if InvalidAuthenticityToken was raised, CurrentUser isn't set so we have to use the blank layout.
|
# if InvalidAuthenticityToken was raised, CurrentUser isn't set so we have to use the blank layout.
|
||||||
layout = CurrentUser.user.present? ? "default" : "blank"
|
layout = CurrentUser.user.present? ? "default" : "blank"
|
||||||
|
|
||||||
DanbooruLogger.log(@exception, expected: @expected)
|
DanbooruLogger.log(@exception, expected: @expected) if @exception
|
||||||
render template, layout: layout, status: status, formats: format
|
render template, layout: layout, status: status, formats: format
|
||||||
rescue ActionView::MissingTemplate
|
rescue ActionView::MissingTemplate
|
||||||
render "static/error", layout: layout, status: status, formats: format
|
render "static/error", layout: layout, status: status, formats: format
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
class StaticController < ApplicationController
|
class StaticController < ApplicationController
|
||||||
|
respond_to :html, :json, :xml
|
||||||
|
|
||||||
def privacy_policy
|
def privacy_policy
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -6,7 +8,11 @@ class StaticController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def not_found
|
def not_found
|
||||||
render plain: "not found", status: :not_found
|
@pool = Pool.find(Danbooru.config.page_not_found_pool_id) if Danbooru.config.page_not_found_pool_id.present?
|
||||||
|
@post = @pool.posts.sample if @pool.present?
|
||||||
|
@artist = @post.tags.select(&:artist?).first if @post.present?
|
||||||
|
|
||||||
|
render_error_page(404, nil, template: "static/not_found", message: "Page not found")
|
||||||
end
|
end
|
||||||
|
|
||||||
def error
|
def error
|
||||||
@@ -38,7 +44,7 @@ class StaticController < ApplicationController
|
|||||||
@search = { is_deleted: "false" }
|
@search = { is_deleted: "false" }
|
||||||
when "posts"
|
when "posts"
|
||||||
@relation = Post.order(id: :asc)
|
@relation = Post.order(id: :asc)
|
||||||
@serach = {}
|
@search = {}
|
||||||
when "tags"
|
when "tags"
|
||||||
@relation = Tag.nonempty
|
@relation = Tag.nonempty
|
||||||
@search = {}
|
@search = {}
|
||||||
|
|||||||
26
app/views/static/not_found.html.erb
Normal file
26
app/views/static/not_found.html.erb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<% page_title "Page not found" %>
|
||||||
|
|
||||||
|
<div id="c-static">
|
||||||
|
<div id="a-not-found">
|
||||||
|
<div style="text-align: center">
|
||||||
|
<h1>Page not found</h1>
|
||||||
|
|
||||||
|
<% if @post.present? && @artist.present? %>
|
||||||
|
<p>
|
||||||
|
<%= link_to @post do %>
|
||||||
|
<%= tag.img src: @post.large_file_url %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p class="fineprint">
|
||||||
|
<%= link_to "post ##{@post.id}", @post %>
|
||||||
|
by <%= link_to @artist.name, posts_path(tags: @artist.name), class: tag_class(@artist) %>
|
||||||
|
</p>
|
||||||
|
</p>
|
||||||
|
<% else %>
|
||||||
|
<p>Nobody here but us chickens!</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p><%= link_to "Return to previous page", :back %></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -281,6 +281,11 @@ module Danbooru
|
|||||||
restricted_tags + %w[censored condom nipples nude penis pussy sexually_suggestive]
|
restricted_tags + %w[censored condom nipples nude penis pussy sexually_suggestive]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# If present, the 404 page will show a random post from this pool.
|
||||||
|
def page_not_found_pool_id
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
# Tags that are only visible to Gold+ users.
|
# Tags that are only visible to Gold+ users.
|
||||||
def restricted_tags
|
def restricted_tags
|
||||||
[]
|
[]
|
||||||
|
|||||||
@@ -321,5 +321,5 @@ Rails.application.routes.draw do
|
|||||||
get "/mock/iqdbs/similar" => "mock_services#iqdbs_similar", as: "mock_iqdbs_similar"
|
get "/mock/iqdbs/similar" => "mock_services#iqdbs_similar", as: "mock_iqdbs_similar"
|
||||||
post "/mock/iqdbs/similar" => "mock_services#iqdbs_similar"
|
post "/mock/iqdbs/similar" => "mock_services#iqdbs_similar"
|
||||||
|
|
||||||
get "*other", :to => "static#not_found"
|
match "*other", to: "static#not_found", via: :all
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Page not found</title>
|
|
||||||
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
|
|
||||||
<link rel="stylesheet" type="text/css" media="screen" href="/assets/application.css" title="default" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="text-align: center;">
|
|
||||||
<h1>That page does not exist</h1>
|
|
||||||
<p><a href="/">Return to index</a></p>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Failbooru</title>
|
|
||||||
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
|
|
||||||
<link rel="stylesheet" type="text/css" media="screen" href="/assets/application.css" title="default" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="text-align: center;">
|
|
||||||
<h1>Something broke</h1>
|
|
||||||
<p><a href="/">Return to index</a></p>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -47,10 +47,42 @@ class StaticControllerTest < ActionDispatch::IntegrationTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
context "not_found action" do
|
context "not_found action" do
|
||||||
should "work" do
|
should "return the 404 page for GET requests" do
|
||||||
get "/qwoiqogieqg"
|
get "/qwoiqogieqg"
|
||||||
assert_response 404
|
assert_response 404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "return the 404 page for POST requests" do
|
||||||
|
post "/qwoiqogieqg"
|
||||||
|
assert_response 404
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return a JSON response for a 404'd JSON request" do
|
||||||
|
get "/qwoiqogieqg", as: :json
|
||||||
|
|
||||||
|
assert_response 404
|
||||||
|
assert_equal("Page not found", response.parsed_body["message"])
|
||||||
|
end
|
||||||
|
|
||||||
|
should "return an XML response for a 404'd XML request" do
|
||||||
|
get "/qwoiqogieqg", as: :xml
|
||||||
|
|
||||||
|
assert_response 404
|
||||||
|
assert_equal("Page not found", response.parsed_body.at("result").text)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "render the 404 page when page_not_found_pool_id is configured" do
|
||||||
|
as(create(:user)) do
|
||||||
|
@post = create(:post, tag_string: "artist:bkub")
|
||||||
|
@pool = create(:pool, post_ids: [@post.id])
|
||||||
|
Danbooru.config.stubs(:page_not_found_pool_id).returns(@pool.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
get "/qwoiqogieqg"
|
||||||
|
|
||||||
|
assert_response 404
|
||||||
|
assert_select "#c-static #a-not-found img", count: 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "bookmarklet action" do
|
context "bookmarklet action" do
|
||||||
|
|||||||
Reference in New Issue
Block a user