2016-05-14 7 views
0

私が望むなら、ユーザが見つからなければエラーを救済し、適切なページにリダイレクトすることができます。しかし、私はrescue_fromメソッドをすべてのルートではなく特定のルートでのみ使用したいと考えています。特定のルート上でrescue_fromを使用しているレール

rescue_from ActiveRecord::RecordNotFound, with: :record_not_found, except: [:new, :edit]

に似たので、かなり多くの何かこれを行う方法はありますか?ヘルプは高く評価されています!

class UserController < ApplicationController 

    before_action :get_user 

    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

    def show 
    end 

    def new 
    end 

    def create 
    end 

    def edit 
    end 

    def update 
    end 

    private 
    def get_user 
     User.find(params[:id]) 
    end 

    def record_not_found 
     redirect_to user_path, error: "Sorry, no user found." 
    end 
end 

答えて

0

--update -

おそらくこの質問にも役立つかもしれないbefore_action

before_action :problem, except: [:new, :edit] 

private 

def problem 
    begin 
    @user = User.find(params[:id]) 
    rescue ActiveRecord::RecordNotFound 
    redirect_to user_path, error: "Sorry, no user found." 
    end 
end 

にそれを入れて持ってrescue from ActiveRecord::RecordNotFound in Rails

1

は、その必要なときのみ、コールバックを呼び出すことで起動できます:

before_action :get_user, only: [:show, :edit, :update, :destroy] 

それは後で使用できるように照会レコードがさえ変数に代入されていませんが。 - 私たちも、それが実際に失敗したユーザーのクエリだったことを知らない

class UserController < ApplicationController 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 

    # ... 

    private 

    def set_user 
     @user = User.find(params[:id]) 
    end 
end 

我々はrescue_from ActiveRecord::RecordNotFound, with: :record_not_foundを使用することもできますが:それを修正することができます!たとえば、ApplicationControllerの上流に定義された他のコールバックである可能性があります。

また、リソースが見つからない場合、アプリケーションはクライアントに404 - NOT FOUNDまたは410 - GONEという応答を送信することを伝える必要があります。リソースが一時的に移動したことを示す3xx応答コードを送信することでリダイレクトすることはありません。

あなたが代わりにコールバックで直接例外を救うことができます:

def set_user 
     begin 
     @user = User.find(params[:id]) 
     rescue ActiveRecord::RecordNotFound 
     @users = User.all 
     flash.now[:error] = "User not found" 
     # note that we render - not redirect! 
     render :index, status: 404 
     end 
    end 

をほとんどの場合、ハンドラをデフォルトではなく、あなたのアプリケーションのRESTインターフェイスをアップバングルとの束を追加するためにそれを残した方が良いですが、複雑。

0

溶液Aは、同様に、このbefore_filterを定義する共通の親コントローラを使用します。

class RescueNotRoundRecordController < ApplicationController 
    rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

    private 
    def record_not_found 
    redirect_to user_path, error: "Sorry, no user found." 
    end 
end 

class UserController < RescueNotRoundRecordController 
    before_action :get_user 
end 

溶液B、私が考えている、ということを行うために使用モジュールは、行くには良い方法です:

module RescueNotRoundRecord 
    def self.included(mod) 
    mod.class_eval do 
     rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 
    end 
    end 

    private 
    def record_not_found 
    redirect_to user_path, error: "Sorry, no user found." 
    end 
end 

class UserController < ApplicationController 
    include RescueNotRoundRecord 
end 
関連する問題