Cela ressemble à une question de programmation générique pour moi. Si vous avez des problèmes avec certains plugins Rails, vous pouvez toujours déboguer son code avec un tas de méthodes simples ou hardcore, essayez de comprendre et de corriger l'erreur. La question est, quelles méthodes devez-vous utiliser dans des situations particulières.
Je vais vous donner un petit exemple. Lorsque vous déboguez votre application Rails, vérifiez toujours logs/production.log
ou logs/development.log
(en fonction du mode que vous utilisez) pour les erreurs de toutes sortes. Chaque erreur dans Ruby/Rails est représentée par une énorme pile-trace que vous devriez lire de haut en bas. Comme celui-ci:
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 protected]
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'
...
Nous y sommes! La ligne ArgumentError (invalid byte sequence in UTF-8):
, tout en haut de cette trace, nous indique toujours le type d'erreur. C'est une erreur d'argument!
Ensuite, regardez la ligne suivante: /usr/lib/ruby/1.9.1/net/protocol.rb:294:in 'slice!'
. Il indique où l'exception (ArgumentError
) a été soulevée dans le format suivant:
/path/to/file/:line:in `method_name'`
Ouvrons ce fichier négligents et trouver la source autour de cette ligne:
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
L'erreur est sur la ligne suivante:
while line = @wbuf.slice!(/\A.*(?:\n|\r\n|\r(?!\z))/n)
de ce point nous savons où l'erreur est et seulement besoin de le corriger, mais ce processus est hors de portée de mon histoire courte. Je voulais juste vous montrer comment travailler avec des erreurs dans Rails.
Merci pour votre effort incroyable pour répondre à cette question, j'en ai beaucoup appris. Cependant, je veux que plus de gens répondent, afin que je puisse apprendre encore plus d'aspects de la programmation de RoR. Donc, si vous me le permettez, j'aimerais que ma réponse soit acceptée. Il y a d'autres questions concernant le débogage que je viens de poster, je serais assez humble pour avoir d'autres bonnes réponses de votre part: voir http://stackoverflow.com/questions/3586386/how-to-debug-a-plugin-or-gem -using-ruby-debug-gem-où-la-partie-je-voulais-à-deb et http: // stackoverflow.com/questions/3585985/how-to-debug-a-plugin-gem Merci encore! – jaycode