2016-05-14 4 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 -

Возможно поместить его в

private 

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

и имеют before_action

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

Этот вопрос может также помочь 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

Раствор А, используйте общий родительский контроллер, которые определяют этот 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 

Solution 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 
Смежные вопросы