match '*path' => redirect('/'), via: :all if Rails.env.production?
可以很好地处理事情,但它没有正确地捕获这样的案例
/root.com/articles/293
其中293是数据库中不存在的文章ID。
在这种情况下,它仍然会重定向到默认的404页面,在heroku上是一个丑陋的“出错了”页面。
如何点击“有效网址,但资源ID无效”网址来控制其重定向到我想要的位置?
答案 0 :(得分:3)
结帐rescue_from
。当你想偏离Rails'时,这非常方便。显示404页面的默认行为。
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
private
def record_not_found
# handle redirect
end
end
答案 1 :(得分:0)
在我看来,这是您在控制器中执行的检查。有点像:
class ArticlesController < ApplicationController
def show
id = params[:id]
if Article.exists?(id)
#proceed as normal
else
#redirect to "Article doesn't exist" page
end
end
end
您可以创建如下通用方法:
class ApplicationController < ActionController::Base
def redirect_if_does_not_exist
id = params[:id]
model_name = controller_name.classify.constantize
unless model_name.exists?(id)
# handle redirect
end
end
然后,您可以在要检查的控制器上的before_action
回调中调用此方法。像这样:
class ArticlesController < ApplicationController
before_action :redirect_if_does_not_exist
end