Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 如何处理由nil:NilClass引起的异常_Ruby On Rails 3_Ruby On Rails 4 - Fatal编程技术网

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
因此,如果URL
localhost: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

非常感谢!那么,异常控制似乎是处理此问题的唯一“标准方法”?我还需要写很多其他的动作,所以这意味着我必须在每个动作中添加相同的代码,这不是干巴巴的。只是不知道是否有办法让控制器保持“瘦”。。