Как мне написать код, если в БД отсутствует params [: id] - PullRequest
0 голосов
/ 25 сентября 2019

Я пишу действие show в контроллере и хочу выполнить ветвление, если в моей базе данных нет идентификатора, полученного от params[:id].

Мое приложение все еще создается.Я пробовал условное ветвление и обработку исключений.Однако они не работали должным образом.

class ArticlesController < ApplicationController

  #...

  def show
    begin
      @article = Article.find(params[:id])
    rescue
      render root
    end
  end

  #...

end

Я ожидаю перенаправления в корень в случае возникновения ошибки.

Приведенный выше код возвращает запись, если она найдена успешно.Тем не менее, ActiveRecord::RecordNotFound in ArticlesController#show происходит, если запись не найдена.

Как мне написать код для этой ошибки?

Ответы [ 5 ]

2 голосов
/ 25 сентября 2019

Как мне написать код для этой ошибки?

Краткий ответ: "Вы не должны".

Исключения должны быть, IMO, исключительными.Звучит так, как будто вы можете ожидать этого обстоятельства, поэтому я предлагаю вам написать код, который обрабатывает сценарий, не вызывая исключения.

Если вы действительно думаете, что у вас есть обстоятельства, когда запись Article не существует дляучитывая params[:id] (кажется немного странным, но я полагаю, что это возможно), тогда я бы посоветовал вам использовать .find_by вместо .find:

class ArticlesController < ApplicationController

  #...

  def show
    if @article = Article.find_by(id: params[:id])
      # do something with the article 
    else
      render root
    end
  end

  #...

end

Кажется, что вы можете захотетьсделайте redirect вместо render:

class ArticlesController < ApplicationController

  #...

  def show
    if @article = Article.find_by(id: params[:id])
      # do something with the article 
    else
      redirect_to root_path
    end
  end

  #...

end

Но, может быть, не ...

Кроме того, спасите все так:

def show
  begin
    @article = Article.find(params[:id])
  rescue
    render root
  end
end

... обычно рассматривается как запах кода.Есть много статей на веб-сайтах о том, почему.

0 голосов
/ 25 сентября 2019

зачем писать так много кода, а вы можете достичь только двумя строками.

class ArticlesController < ApplicationController
  def show
    @article = Article.find_by(id: params[:id])
    redirect_to root_path unless @article.present?
  end 
end 
0 голосов
/ 25 сентября 2019

Может быть, вы можете кодировать так:

 def show
    @article = Article.find_by(id: params[:id])
    unless @article.present?
      flash[:error] = "Not Found."
      redirect_to root_path
    end
  end
0 голосов
/ 25 сентября 2019

Вы можете обработать исключение из ArticlesController, но я советую поставить код на ApplicationController следующим образом:

rescue_from ActiveRecord::RecordNotFound do
   redirect_back fallback_location: root_path, alert: t("resource_not_found")
end
0 голосов
/ 25 сентября 2019

Ваш код должен быть написан так:

 def show
    begin
      @article = Article.find(params[:id])
    rescue
      redirect_to root_path
    end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...