7

目前,当我在 erb 模板(与 HTTPServer/cgi 一起使用)上遇到错误时,我会执行以下操作:

  • 如果是很小的更改,请还原、保存并重新测试。
  • 对于较大的更改或新文件,请删除或注释 1/2 代码,然后重新测试。执行二进制搜索,直到我删除/找到损坏的代码。

调用堆栈似乎与我的 .rhtml 文件中的任何内容都不对应。

(erb):6:in `block in <main>'
/opt/local/lib/ruby/1.9.1/erb.rb:753:in `eval'
/opt/local/lib/ruby/1.9.1/erb.rb:753:in `result'
bin/correct.rb:45:in `block in <main>'
/opt/local/lib/ruby/1.9.1/webrick/httpservlet/prochandler.rb:26:in `call'
4

4 回答 4

8

不确定这是否适用于这个问题,但也许它会帮助某人。我正在使用 rails 5 如果你把

    <% debugger %>

在您的 html.erb 文件中,它将暂停您的 rails 服务器正在运行的终端窗口。从那里您可以调试 html.erb 文件具有的任何参数或变量。

于 2017-06-15T17:44:55.307 回答
5

正如丹尼尔所说,大多数时候错误消息会帮助您快速找到错误所在。

确实有一些情况不是这样。

进行二进制搜索的更笨,更快的方法是插入错误的行,例如

<%= the_error_is_after_this_line %>

然后移动该行,直到找到确切的行。

我不是那些每次可以编写大量行的聪明程序员之一。我通常通过小步骤开发并每次在浏览器上重新加载页面。

也就是说,避免难以调试视图(或方法,或其他)的更好方法是编写简单、简短的视图。我的经验法则是我必须能够在编辑器窗口中阅读整个视图(或方法),除非它只是纯 html。

始终使用助手和部分视图。您可以在 erb 视图的一行中计算两个以上的 () 或 [] 吗?如果是,请使用助手。

你能在你的视野中数出两个或三个以上的街区吗?使用一些部分。

于 2009-08-29T06:33:50.117 回答
0

一般来说,Erb 错误会告诉您它们发生的位置。例如,您的错误出现在 erb 文件的第 6 行。您省略了回溯附带的错误消息,但这通常会告诉您要查找的错误类型。例如,在我的简单测试中:

NameError: undefined local variable or method `asdf' for main:Object
  from (erb):7
  from (irb):6

哪里出了问题,哪里出了问题已经很清楚了。

您能否发布有关您的错误和导致错误的 erb 的更多信息?

于 2009-08-29T05:47:16.667 回答
0

在 Rails 5 上,您可以在 Gemfile 中默认找到 gem 'byebug':

    group :development, :test do
      # Call 'byebug' anywhere in the code to stop execution and get a debugger console
      gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
    end

然后你可以在你的控制器上使用 byebug,把它放在你想要的任何地方,多次你需要,它的功能就像一个“断点”,最后运行你的服务器 $ rails server

class UsersController < ApplicationController
   byebug
end

在命令行为选项写帮助,通常使用字母'c'继续下一个断点,或字母'n'逐步前进,ctrl+d退出。

 (byebug) help

  break      -- Sets breakpoints in the source code
  catch      -- Handles exception catchpoints
  condition  -- Sets conditions on breakpoints
  continue   -- Runs until program ends, hits a breakpoint or reaches a line
  debug      -- Spawns a subdebugger
  delete     -- Deletes breakpoints
  disable    -- Disables breakpoints or displays
  display    -- Evaluates expressions every time the debugger stops
  down       -- Moves to a lower frame in the stack trace
  edit       -- Edits source files
  enable     -- Enables breakpoints or displays
  finish     -- Runs the program until frame returns
  frame      -- Moves to a frame in the call stack
  help       -- Helps you using byebug
  history    -- Shows byebug's history of commands
  info       -- Shows several informations about the program being debugged
  interrupt  -- Interrupts the program
  irb        -- Starts an IRB session
  kill       -- Sends a signal to the current process
  list       -- Lists lines of source code
  method     -- Shows methods of an object, class or module
  next       -- Runs one or more lines of code
  pry        -- Starts a Pry session
  quit       -- Exits byebug
  restart    -- Restarts the debugged program
  save       -- Saves current byebug session to a file
  set        -- Modifies byebug settings
  show       -- Shows byebug settings
  skip       -- Runs until the next breakpoint as long as it is different from the current one
  source     -- Restores a previously saved byebug session
  step       -- Steps into blocks or methods one or more times
  thread     -- Commands to manipulate threads
  tracevar   -- Enables tracing of a global variable
  undisplay  -- Stops displaying all or some expressions when program stops
  untracevar -- Stops tracing a global variable
  up         -- Moves to a higher frame in the stack trace
  var        -- Shows variables and its values
  where      -- Displays the backtrace

(byebug)

显示调试(参数)的其他选项:在 app/views/layouts/application.html.erb 文件下的渲染页脚和上面放置下一个:

<%= debug(params) if Rails.env.development? %>

最后,我分享了这个选项,因为我是 Ruby on Rails 的新手。希望这可以帮助。

一些帮助的来源:https ://rubyplus.com/articles/3631-Debugging-using-ByeBug-Gem-in-Rails-5

于 2019-06-11T02:05:04.570 回答