Ruby on rails 3 如何处理由nil:NilClass引起的异常
我有一个名为Ruby on rails 3 如何处理由nil:NilClass引起的异常,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails 3,Ruby On Rails 4,我有一个名为测验的模型,它有许多问题模型。我想添加一些类型的esception处理,以便当用户在URL中键入错误的quick\u id时,将呈现一个错误页面 我在我的QuestionsController中编写了一些助手方法来处理异常: private def render_error(message) @error_message = message render 'error' end def active_quizzes_safe active_quizzes =
测验
的模型,它有许多问题
模型。我想添加一些类型的esception处理,以便当用户在URL中键入错误的quick\u id
时,将呈现一个错误页面
我在我的QuestionsController
中编写了一些助手方法来处理异常:
private
def render_error(message)
@error_message = message
render 'error'
end
def active_quizzes_safe
active_quizzes = Quiz.active_quizzes(current_user.id)
render_error('Sorry! The request is invalid! Please log in again!') if active_quizzes.nil?
active_quizzes
end
def active_quiz_safe(quiz_id)
active_quiz = active_quizzes_safe.where(id: quiz_id).first
render_error('The quiz does not exist or you are not allowed to take this quiz!') if active_quiz.blank?
active_quiz
end
下面是问题控制器中存在问题的操作:
def show_quiz
if current_user
@quiz = active_quiz_safe(params[:quiz_id])
@questions = @quiz.questions
end
end
因此,如果URLlocalhost:3000/MY\u URL/:quick\u id
中的:quick\u id
不正确(即找不到记录),则应使用呈现错误
方法呈现错误页面。然而,当我厌倦了一个错误的:quick\u id
,我得到了nil:NilClass
的未定义的方法“问题”。我猜这是因为show\u quick
方法中的@questions=@quick.questions
但是,执行是否应该在render_error
操作之后停止,即@questions=@quick.questions
之前?为什么仍然执行@questions=@quick.questions
另外,有没有标准的方法来处理像这样的nil:NilClass错误
谢谢 调用render
方法不会停止操作。因此,您应该仔细设计您的操作,以确保在渲染后立即返回。像这样:
def show_quiz
if current_user
active_quizzes = Quiz.active_quizzes(current_user.id)
if active_quizzes.nil?
render_error('Sorry! The request is invalid! Please log in again!')
else
@quiz = active_quizzes_safe.where(id: quiz_id).first
if @quiz.blank?
render_error('The quiz does not exist or you are not allowed to take this quiz!')
else
@questions = @quiz.questions
end
end
end
end
但在这种情况下,我认为最好使用一些异常控制,如:
def show_quiz
if current_user
active_quizzes = Quiz.active_quizzes(current_user.id)
@quiz = active_quizzes_safe.find(quiz_id)
@questions = @quiz.questions
end
rescue ActiveRecord::RecordNotFound
render_error 'The quiz does not exist or you are not allowed to take this quiz!'
end
查看您的public/404.html、public/422.html和public/500.html
文件。如果仍然发生错误,Rails将自动重定向。所以我认为您不需要手动处理异常,除非您有特定的情况。要测试和查看此错误,请在生产中运行应用程序bundle exec rails s rails\u ENV=production
非常感谢!那么,异常控制似乎是处理此问题的唯一“标准方法”?我还需要写很多其他的动作,所以这意味着我必须在每个动作中添加相同的代码,这不是干巴巴的。只是不知道是否有办法让控制器保持“瘦”。。