Для меня это общий вопрос программирования.Если у вас есть какие-либо проблемы с каким-либо плагином 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.