2013-03-19 149 views
2

目前中调用的时候,重建我的数据库Rails项目,我运行在命令行中输入以下Rake任务:Rake任务的命令行工作,但失败rake任务

bundle exec rake db:drop 
bundle exec rake db:create 
bundle exec rake db:migrate 
bundle exec rake db:seed 

我想把一个Rake任务的这些里面,所以我创建了一个lib/tasks/db.rake文件:

namespace :db do 
    desc 'Drop and recreate the database(s)' 
    task :clean do 
    Rake::Task["db:drop"].invoke 
    Rake::Task["db:create"].invoke 
    Rake::Task["db:migrate"].invoke 
    Rake::Task["db:seed"].invoke # This doesn't work for some reason... 
    end 
end 

前几个任务运行良好,但db:seed崩溃,一个奇怪的错误:

undefined method `username' for #<User:0xdfaa494> 
[...]/gems/activemodel-3.2.12/lib/active_model/attribute_methods.rb:407:in `method_missing' 
[...]/gems/activerecord-3.2.12/lib/active_record/attribute_methods.rb:149:in `method_missing' 
[...]/lib/acts_as_followable/followable.rb:42:in `method_missing' 
[...]/gems/friendly_id-4.0.9/lib/friendly_id/slugged.rb:253:in `should_generate_new_friendly_id?' 
[...]/gems/friendly_id-4.0.9/lib/friendly_id/slugged.rb:273:in `set_slug' 
[...]/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:407:in `_run__819679792__validation__197267883__callbacks' 
[...]/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:405:in `__run_callback' 
[...]/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:385:in `_run_validation_callbacks' 
[...]/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:81:in `run_callbacks' 
[...]/gems/activemodel-3.2.12/lib/active_model/validations/callbacks.rb:53:in `run_validations!' 
[...]/gems/activemodel-3.2.12/lib/active_model/validations.rb:195:in `valid?' 
[...]/gems/activerecord-3.2.12/lib/active_record/validations.rb:69:in `valid?' 
[...]/gems/activerecord-3.2.12/lib/active_record/validations.rb:77:in `perform_validations' 
[...]/gems/activerecord-3.2.12/lib/active_record/validations.rb:50:in `save' 
[...]/gems/activerecord-3.2.12/lib/active_record/attribute_methods/dirty.rb:22:in `save' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:259:in `block (2 levels) in save' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status' 
[...]/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:208:in `transaction' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:311:in `with_transaction_returning_status' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:259:in `block in save' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:270:in `rollback_active_record_state!' 
[...]/gems/activerecord-3.2.12/lib/active_record/transactions.rb:258:in `save' 
[...]/gems/activerecord-3.2.12/lib/active_record/relation/finder_methods.rb:294:in `find_or_instantiator_by_attributes' 
[...]/gems/activerecord-3.2.12/lib/active_record/dynamic_matchers.rb:52:in `method_missing' 
[...]/db/core_data/roles_and_users.rb:7:in `<top (required)>' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `block in load' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load' 
[...]/db/seeds.rb:20:in `block in <top (required)>' 
[...]/db/seeds.rb:19:in `each' 
[...]/db/seeds.rb:19:in `<top (required)>' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `block in load' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency' 
[...]/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:245:in `load' 
[...]/gems/railties-3.2.12/lib/rails/engine.rb:520:in `load_seed' 
[...]/gems/activerecord-3.2.12/lib/active_record/railties/databases.rake:333:in `block (2 levels) in <top (required)>' 
[...]/lib/tasks/db.rake:11:in `block (2 levels) in <top (required)>' 
[...]/bin/ruby_noexec_wrapper:14:in `eval' 
[...]/bin/ruby_noexec_wrapper:14:in `<main>' 
Tasks: TOP => db:seed 

在命令行或运行应用程序时不会发生此错误。

UPDATE:这里是关于的代码库和架构的详细信息。

线db/core_data/roles_and_users.rb 7:app/models/user.rb

admin_user = User.find_or_create_by_email('[email protected]') # not the actual email address used in the file 

部分:

class User < ActiveRecord::Base 
    include ApplicationHelper, FriendlyId, ActsAsFollowable::Followable, Disableable 
    ... 
    friendly_id :username, :use => :slugged 
    attr_accessible :username 
    ... 
    username_format = /^[a-z\d]+([-_][a-z\d]+)*$/i 
    validates :username, :presence => true, :uniqueness => true, :format => { :with => username_format, :message => "can only contain letters, numbers, underscores (_) or dashes (-). Spaces are not allowed."}, :unreserved_word => true, :length => { :minimum => 3, :maximum => 60 } 
    ... 
end 

username是在数据库中VARCHAR(255)字段中。

UPDATE 2:看起来Rake环境没有正确设置。如果我更换线7在db/core_data/roles_and_users.rb与下列:

admin_user = User.create(:email => '[email protected]', :username => 'administrator') 

然后,错误是:

unknown attribute: username 

如果我比较手动调用的命令行(工作)针对耙的输出,并且我还输出用户模式:

# Command line invocation -- WORKS 
[2013-03-25 09:42:08] INFO Rails : Connecting to database specified by database.yml 
** Invoke db:load_config (first_time) 
** Execute db:load_config 
** Execute db:abort_if_pending_migrations 
Creating badges... 
Creating Shipping Options... 
    For UPS... 
    For USPS... 
Creating roles... 
Creating users... 
User(id: integer, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, last_day_logged_in: datetime, consecutive_days_logged_in: integer, username: string, confirmation_sent_at: datetime, confirmed_at: datetime, confirmation_token: string, failed_attempts: integer, unlock_token: string, locked_at: datetime, super_user: boolean, facebook_id: string, facebook_email: string, fb_auth_token: string, slug: string, forem_admin: boolean, forem_state: string, forem_auto_subscribe: boolean, disabled: boolean, delta: boolean, latitude: float, longitude: float) 

# Rake invocation -- DOESN'T WORK 
** Invoke db:schema:load (first_time) 
** Invoke environment 
** Invoke db:load_config 
** Execute db:schema:load 
** Invoke db:seed (first_time) 
** Execute db:seed 
** Invoke db:abort_if_pending_migrations 
Creating badges... 
Creating Shipping Options... 
    For UPS... 
    For USPS... 
Creating roles... 
Creating users... 
User(id: integer, email: string, encrypted_password: string, reset_password_token: string, reset_password_sent_at: datetime, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime) 
rake aborted! 
undefined method `username' for #<User:0xdad7fc0> 

正如你所看到的,耙不会看到很多模特的领域,即使他们存在于数据库中。

回答

-1

虽然它是一种迂回的解决方案,在你db:clean任务我会尝试使用system()执行命令或包裹在反引号耙通话,即:

system("bundle exec rake db:drop") 
system("bundle exec rake db:create") 
system("bundle exec rake db:migrate") 
system("bundle exec rake db:seed") 

`bundle exec rake db:drop` 
`bundle exec rake db:create` 
`bundle exec rake db:migrate` 
`bundle exec rake db:seed` 

虽这么说,我还没有测试它,但它应该工作。

+0

这不是一个完美的解决方案,但它的工作原理。请注意,反引号_return_的输出,所以你必须自己打印它,如果你想看到它。我也尝试了exec(),但是它取代了Rake进程而不是在子shell中运行。 – 2013-06-03 03:33:13

1

我不知道这是否会工作,但尝试:

namespace :db do 
    desc 'Drop and recreate the database(s)' 
    task :clean => :environment do 
    ... 
    end 
end 

UPDATE:如果这是你的任务的完整代码,你可以定义如下执行其他任务:

namespace :db do 
    desc 'Drop and recreate the database(s)' 
    task :clean => [:drop, :create, :migrate, :seed] 
end 

希望这有助于! :)

更新2:我想我没有正确地读取回溯...错误说您的用户对象没有username定义的方法。这可以通过两种不同的错误造成的:

  1. 你应该手动定义的username方法。

  2. 您已经于您的迁移增加了一个username场,但不知何故,它不存在。

在迁移检查spellwritings并确认你没有需要实现选项1。然后检查db/core_data/roles_and_users.rb:7文件(从回溯中提取)。

如果这不能解决你的问题,我不知道自己还能做些什么:(

+0

感谢您的想法,但没有解决它。 – 2013-03-19 18:44:09

+0

我已经用另一个代码更新了答案,希望这有助于:) – mrcasals 2013-03-20 11:40:07

+0

对不起,我也试过,并且我得到了同样的错误。 – 2013-03-21 13:53:03