Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #4953 (closed defect: wontfix)

Opened 3 years ago

Last modified 2 years ago

validates_presence_of :link in a model breaks the ability to do Model.create in migrations

Reported by: cohen1@gmail.com Assigned to: David
Priority: normal Milestone:
Component: ActiveRecord Version: 1.1.1
Severity: normal Keywords:
Cc:

Description

I created a model called Feature which has:

validates_presence_of :link

In my migration file on line 10 i have:

Feature.create(:imgurl => '/images/features/1706.jpg', :title => 'bleh', :url => 'http://www.bleh.com', :window => 1, :post => p)

This will break migrations

(My first bugreport!)


Error message:

ron@ron-laptop:~/rails/tgt11v2$ rake migrate VERSION=7 --trace
(in /home/ron/rails/tgt11v2)
** Invoke migrate (first_time)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== InsertInitialFeatures: migrating ===========================================
rake aborted!
wrong number of arguments (1 for 2)
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:812:in `link'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:812:in `link'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:74:in `add_on_blank'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:73:in `add_on_blank'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:393:in `validates_presence_of'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:794:in `run_validations'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:788:in `run_validations'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:752:in `valid_without_callbacks'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/callbacks.rb:306:in `valid?'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validations.rb:723:in `save_without_transactions'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transactions.rb:126:in `save'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connection_adapters/abstract/database_statements.rb:51:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transactions.rb:91:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transactions.rb:118:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transactions.rb:126:in `save'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb:408:in `create'
./db/migrate//007_insert_initial_features.rb:10:in `real_up'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connection_adapters/abstract/database_statements.rb:51:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transactions.rb:91:in `transaction'
./db/migrate//007_insert_initial_features.rb:3:in `real_up'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:210:in `migrate'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:210:in `migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:332:in `migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:327:in `migrate'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:294:in `up'
/usr/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/migration.rb:285:in `migrate'
/usr/lib/ruby/gems/1.8/gems/rails-1.1.2/lib/tasks/databases.rake:4
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:387:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:387:in `execute'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:357:in `invoke'
/usr/lib/ruby/1.8/thread.rb:135:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:350:in `invoke'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:364:in `invoke_prerequisites'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:999:in `each'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:363:in `invoke_prerequisites'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:356:in `invoke'
/usr/lib/ruby/1.8/thread.rb:135:in `synchronize'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:350:in `invoke'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:1906:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:1906:in `run'
/usr/lib/ruby/gems/1.8/gems/rake-0.7.1/bin/rake:7
/usr/bin/rake:18
ron@ron-laptop:~/rails/tgt11v2$

Change History

(follow-up: ↓ 2 ) 05/02/06 00:40:12 changed by rick

  • status changed from new to closed.
  • resolution set to invalid.

That's what validations do, they keep you from entering bad data. You can try out toolmantim's handy tip on safely using models in migrations at http://rails.techno-weenie.net/tip/2006/2/23/safely_using_models_in_migrations, however.

(in reply to: ↑ 1 ) 11/11/06 12:22:07 changed by rusi

  • status changed from closed to reopened.
  • resolution deleted.

I have the same problem. The name "link" makes it break. Same exception here. Apparently, if a model has "link" as attribute and validates it, in migrations some link method of rake gets called.

example:

class Item < ActiveRecord::Base

validates_presence_of :link

end

in migration:

Item.new :link => "http://slashdot.org" p item.attributes {"link"=>"http://slashdot.org/"} item.save!

... Bang, the exception above

removing the validates_presence_of :link in Item makes it work - the Item is save correctly.

01/17/07 23:19:21 changed by manfred

  • status changed from reopened to closed.
  • resolution set to wontfix.

This is an issue with Rake, they include FileUtils into Object so it's easy to do file operations in a Rake task. One of these methods is link. Because they're included in Object, they are also present in ActiveRecord. The validation tries to call the method link on the ActiveRecord instance and finds the link from FileUtils. That's why this is going wrong.

Test with Object.new.send(:link).

I'm afraid we can't fix this in Rails, you're going to have to go upstream to Rake and work out a solution for this.