我厌倦了在使用许多过时的插件/宝石时提出未回答的问题,有时他们并没有按照我真正想要的方式工作。
所以我的问题很简单:
如果我是一名PHP程序员,并且Rails是我的第一个框架,那么我接下来需要学习什么才能在处理麻烦的插件或代码片段或教程时依赖自己?
我以前在PHP中的电子商务系统(我现在知道MVC相当愚蠢)非常好,通常我会继续读出插件的代码以找出它的作用,但显然正在做Ruby on Rails是非常难的,我应该继续这样做,还是我走的正确? (顺便说一下,我确实学习过,但是当我还在使用PHP和“电子商务框架”时,速度非常缓慢)
答案 0 :(得分:2)
这对我来说就像是一个通用的编程问题。如果您对某些Rails插件有任何麻烦,您可以随时使用一堆硬核或简单方法调试其代码,尝试理解并修复错误。问题是,您应该在特定情况下使用哪些方法。
我会举一个小例子。在调试Rails应用程序时,请始终检查logs/production.log
或logs/development.log
(取决于您正在使用的模式)以查找任何类型的错误。 Ruby / Rails中的每个错误都由一个巨大的堆栈跟踪表示,您应该从上到下阅读。像这样:
Processing CommentsController#create (for ***.***.***.171 at 2010-08-27 03:31:29) [POST]
Parameters: {"authenticity_token"=>"[STRIPPED]"}, "last_comment_id"=>"0", "original_controller"=>"projects", "thread"=>"true", "thread_id"=>"Conversation_31", "commit"=>"Save", "_"=>"", "controller"=>"comments", "action"=>"create", "conversation_id"=>"31"}
Sent mail to email@email.com
ArgumentError (invalid byte sequence in UTF-8):
/usr/lib/ruby/1.9.1/net/protocol.rb:294:in `slice!'
/usr/lib/ruby/1.9.1/net/protocol.rb:294:in `each_crlf_line'
/usr/lib/ruby/1.9.1/net/protocol.rb:236:in `write_message_0'
/usr/lib/ruby/1.9.1/net/protocol.rb:250:in `block (2 levels) in write_message'
/usr/lib/ruby/1.9.1/net/protocol.rb:280:in `using_each_crlf_line'
/usr/lib/ruby/1.9.1/net/protocol.rb:250:in `block in write_message'
/usr/lib/ruby/1.9.1/net/protocol.rb:169:in `writing'
/usr/lib/ruby/1.9.1/net/protocol.rb:249:in `write_message'
/usr/lib/ruby/1.9.1/net/smtp.rb:878:in `block in data'
/usr/lib/ruby/1.9.1/net/smtp.rb:921:in `critical'
/usr/lib/ruby/1.9.1/net/smtp.rb:875:in `data'
/usr/lib/ruby/1.9.1/net/smtp.rb:655:in `send_message'
actionmailer (2.3.8) lib/action_mailer/base.rb:684:in `block in perform_delivery_smtp'
/usr/lib/ruby/1.9.1/net/smtp.rb:526:in `start'
actionmailer (2.3.8) lib/action_mailer/base.rb:682:in `perform_delivery_smtp'
actionmailer (2.3.8) lib/action_mailer/base.rb:523:in `deliver!'
actionmailer (2.3.8) lib/action_mailer/base.rb:395:in `method_missing'
app/models/emailer.rb:89:in `send_with_language'
app/models/conversation.rb:51:in `block in notify_new_comment'
app/models/conversation.rb:47:in `each'
app/models/conversation.rb:47:in `notify_new_comment'
...
我们在这里!在此跟踪的最顶部的行ArgumentError (invalid byte sequence in UTF-8):
始终告诉我们错误类型。这是一个争论错误!
之后,请查看下一行:/usr/lib/ruby/1.9.1/net/protocol.rb:294:in 'slice!'
。它以下列格式说明引发异常(ArgumentError
)的位置:
/path/to/file/:line:in `method_name'`
让我们打开那个疏忽的文件并找到该行周围的来源:
def each_crlf_line(src)
buffer_filling(@wbuf, src) do
while line = @wbuf.slice!(/\A.*(?:\n|\r\n|\r(?!\z))/n)
yield line.chomp("\n") + "\r\n"
end
end
end
错误发生在以下行:
while line = @wbuf.slice!(/\A.*(?:\n|\r\n|\r(?!\z))/n)
从这一点开始,我们知道错误的位置,只需要解决它,但这个过程超出了我的短篇小说的范围。我只想告诉你如何处理Rails中的错误。
答案 1 :(得分:1)
你应该继续阅读插件代码。
如果非常困难,你可能会非常擅长。
答案 2 :(得分:0)
观看Yehuda Katz主页上的railsconf.blip.tv视频。他现在是核心轨道开发人员之一,并讨论了他是如何进入的。