我正在寻找一种更简洁的分配变量的方法,如果在控制器的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
感觉不对......什么是最好的方法?
答案 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
前者可能更具可读性。