我在追踪Michael Hartl的Rails教程:
http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-one#top
我使用此命令在单独的窗口中跟踪SQL查询:
tail -f log/development.log
但是,当我在沙箱导轨控制台中时,日志不会被更新为sql语句,而是显示在rails控制台中.我该如何纠正这种行为?
我应该补充说,我的数据库迁移和更改到数据模型(新表等)ARE反映在日志中.只有通过rails控制台中的方法传播的sql语句才会被省略(并在rails控制台中显示).
这是我的宝石文件:
source 'http://rubygems.org' gem 'rails','3.1.0' # Bundle edge Rails instead: # gem 'rails',:git => 'git://github.com/rails/rails.git' gem 'sqlite3' group :development do gem 'rspec-rails','2.6.1' gem 'annotate',:git => 'git://github.com/ctran/annotate_models.git' end group :test do gem 'rspec-rails','2.6.1' gem 'webrat','0.7.3' gem 'spork','0.9.0.rc8' gem 'guard-spork' gem 'autotest','4.4.6' gem 'autotest-rails-pure','4.1.2' gem 'autotest-fsevent','0.2.4' gem 'autotest-growl','0.2.9' end # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails'," ~> 3.1.0" gem 'coffee-rails',"~> 3.1.0" gem 'uglifier' end gem 'jquery-rails' # Use unicorn as the web server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano' # To use debugger # gem 'ruby-debug19',:require => 'ruby-debug'
以下是rails控制台的输出:
Larson-2:sample larson$rails console --sandBox Loading development environment in sandBox (Rails 3.1.0) Any modifications you make will be rolled back on exit ruby-1.9.2-p290 :001 > user = User.create(:name => "A Nother",:email => "another@example.org") (0.1ms) SAVEPOINT active_record_1 sql (13.4ms) INSERT INTO "users" ("created_at","email","name","updated_at") VALUES (?,?,?) [["created_at",Thu,15 Sep 2011 20:34:09 UTC +00:00],["email","another@example.org"],["name","A Nother"],["updated_at",15 Sep 2011 20:34:09 UTC +00:00]] (0.1ms) RELEASE SAVEPOINT active_record_1 => #<User id: 1,name: "A Nother",email: "another@example.org",created_at: "2011-09-15 20:34:09",updated_at: "2011-09-15 20:34:09"> ruby-1.9.2-p290 :002 > user.destroy (0.1ms) SAVEPOINT active_record_1 sql (0.3ms) DELETE FROM "users" WHERE "users"."id" = ? [["id",1]] (0.1ms) RELEASE SAVEPOINT active_record_1 => #<User id: 1,updated_at: "2011-09-15 20:34:09"> ruby-1.9.2-p290 :003 >
这里是我的config / environments / development.rb文件中的设置
Sample::Application.configure do # Settings specified here will take precedence over those in config/application.rb # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false # Log error messages when you accidentally call methods on nil. config.whiny_nils = true # Show full error reports and disable caching config.consider_all_requests_local = true config.action_controller.perform_caching = false # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false # Print deprecation notices to the Rails logger config.active_support.deprecation = :log # Only use best-standards-support built into browsers config.action_dispatch.best_standards_support = :builtin # Do not compress assets config.assets.compress = false # Expands the lines which load the assets config.assets.debug = true #Ensure that log level is set to capture ALL messages (from Stack Overflow) config.log_level = :debug end
最后这是到目前为止的development.log输出:
Larson-2:sample larson$tail -f log/development.log (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" (0.0ms) PRAGMA index_list("users") (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" (0.2ms) select sqlite_version(*) (1.8ms) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"name" varchar(255),"email" varchar(255),"created_at" datetime,"updated_at" datetime) (1.1ms) CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL) (0.0ms) PRAGMA index_list("schema_migrations") (1.6ms) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version") (0.1ms) SELECT version FROM "schema_migrations" (1.0ms) INSERT INTO "schema_migrations" (version) VALUES ('20110915130358')
解决方法
显然,在控制台中显示sql,而不是development.log是Rails 3.1的默认行为.我没有找到一个配置选项来改变这种行为,但我发现,一旦控制台运行,你可以做:
irb(main):001:0> ActiveRecord::Base.logger = Rails.logger
这将把sql从控制台中取出并放回到development.log中.或者,如果您不想每次启动控制台时,都可以编辑gems / railties-(version)/lib/rails/console.rb,并在start方法之后进行上述分配内容如下:
@app.load_console
不是说这是一个很好的解决方案,但它会浪费我,直到找到更好的东西…