Ruby - 如果在DB中找到,则分配变量并返回

时间:2017-03-14 23:20:23

标签: ruby-on-rails ruby ruby-on-rails-5

我正在寻找一种更简洁的分配变量的方法,如果在控制器的before_action方法中找到值,则不需要多次数据库调用,则返回:

if Plan.exists?(plan)
  @plan = Plan.find(plan)
  return
end
logger.error "User selected invalid plan."
redirect_to plan_path, warning: "Invalid plan selected!"

这是一个适合使用救援的地方吗? E.g:

begin
  @plan = Plan.find(plan)
rescue
  logger.error "User selected invalid plan."
  redirect_to plan_path, warning: "Invalid plan selected!"
end

感觉不对......什么是最好的方法?

2 个答案:

答案 0 :(得分:2)

我认为没有最好的方法。这是一个品味问题。我通常在Rails 5 API中执行类似于后一种方式的操作。像

这样的东西
def show
  @book = Book.find(params[:id])
rescue ActiveRecord::RecordNotFound
  render json: { error: "Book not found" }
end

如果一切顺利,我会看到快乐的道路

答案 1 :(得分:1)

Some认为使用异常进行流量控制是一种反模式。就个人而言,我倾向于同意。但是,我想这是风格和偏好的问题。

如下:

  def foo_before_action
    unless @plan = Plan.find_by(id: params[:id])
      redirect_to plan_path, warning: "Invalid plan selected!"
    end
  end

或者也许是一个单行:

  def foo_before_action
    redirect_to plan_path, warning: "Invalid plan selected!" unless @plan = Plan.find_by(id: params[:id])
  end

前者可能更具可读性。