目前,当我在erb模板上遇到错误(用于HTTPServer / cgi)时,我会执行以下操作:
调用堆栈似乎与我的.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'
答案 0 :(得分:3)
正如Daniel所说,大多数情况下,错误消息将帮助您快速找到错误的位置。
确实有些情况下没有。
这种二元搜索更快的方法就是插入错误的行,比如
<%= the_error_is_after_this_line %>
然后移动直到你找到确切的行。
我不是那些能够每次写出大量线条的聪明程序员之一;我通常通过小步骤开发,每次都在浏览器上重新加载页面。
也就是说,避免难以调试视图(或方法或其他)的更好方法是编写简单的简短视图。我的经验法则是我必须能够在编辑器窗口中读取整个视图(或方法),除非它只是简单的html。
始终使用帮助程序和部分视图。你能在erb视图的一行中计算两个以上()或[]吗?如果是,请使用助手。
您可以在视图中计算超过两三个街区吗?使用一些部分。
答案 1 :(得分:3)
不确定这是否适用于此问题但可能会对某人有所帮助。我正在使用rails 5,如果你把
<% debugger %>
在你的html.erb文件中,它将暂停运行rails服务器的终端窗口。从那里你可以调试html.erb文件所具有的任何参数或变量。
答案 2 :(得分:0)
一般来说,Erb错误会告诉您它们发生的位置。例如,您的错误位于erb文件的第6行。您已经省略了回溯附带的错误消息,但这通常会告诉您要查找的错误类型。例如,在我的简单测试中:
NameError: undefined local variable or method `asdf' for main:Object
from (erb):7
from (irb):6
很明显出了什么问题以及在哪里。
您是否可以发布有关错误和导致错误的错误的更多信息?
答案 3 :(得分: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