2013-03-19 3 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 

Эта ошибка не возникает в командной строке или при запуске приложения.

ОБНОВЛЕНИЕ: Подробнее о кодовой базе и схеме.

Линия 7 db/core_data/roles_and_users.rb:

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

Части app/models/user.rb:

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 является (255) поля VARCHAR в базе данных.

ОБНОВЛЕНИЕ 2: Похоже, что среда Грабли не настроена правильно. Если я строка 7 заменить в db/core_data/roles_and_users.rb со следующим:

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

Тогда ошибка:

unknown attribute: username 

Если сравнивать выход ручного вызова из командной строки (который работает) против Грабли и Я также выход модель User:

# 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> 

Как вы можете видеть, Rake не видит много полей модели, несмотря на то, что они существуют в базе данных.

ответ

-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

Это не идеальное решение, но оно работает. Обратите внимание, что backticks _return_ вывод, поэтому вы должны распечатать его самостоятельно, если хотите его увидеть. Я также экспериментировал с exec(), но это заменяет процесс Rake вместо работы в подоболочке. –

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: Я думаю, что я не читал обратную линию должным образом ... Ошибка говорит, что ваш объект User не имеет метода username. Это может быть вызвано 2-х различных ошибок:

  1. Вы должны были определить метод username вручную.

  2. В ваших миграциях вы добавили поле username, но почему-то его там нет.

Проверить spellwritings на миграциях и подтвердить, что вы не должны реализовать вариант 1. Затем проверьте db/core_data/roles_and_users.rb:7 файл (извлеченный из трассировки).

Если это не решит вашу проблему, я не знаю, что еще делать :(

+0

Спасибо за идею, но это не исправить. –

+0

Я обновил ответ другим кодом, надеюсь, что это поможет :) – mrcasals

+0

Извините, я тоже пробовал, и я получаю ту же ошибку. –

Смежные вопросы