如何捕获和重定向有效但无效资源ID的rails路由?

时间:2015-02-24 03:07:25

标签: ruby-on-rails redirect path routes http-status-code-404

match '*path' => redirect('/'), via: :all if Rails.env.production?可以很好地处理事情,但它没有正确地捕获这样的案例

/root.com/articles/293其中293是数据库中不存在的文章ID。

在这种情况下,它仍然会重定向到默认的404页面,在heroku上是一个丑陋的“出错了”页面。

如何点击“有效网址,但资源ID无效”网址来控制其重定向到我想要的位置?

2 个答案:

答案 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