John Wilger
2005-Feb-09 16:09 UTC
[DEFECT] ''validates_inclusion_of'' not working as expected (couldn''t post to Trac as it gave me an error)
Hello,
I tried to post this as a bug on the trac site, but whenever I hit
submit, I got the error message:
---
Precondition Failed
The precondition on the request for the URL /newticket evaluated to false.
---
Anyway...
Let''s say I have the following model classes:
---
class Project < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
validates_inclusion_of :project, :in Project.find_all
end
---
You would expect the validation to work properly (Project.find_all
returns an enumerable), but Ruby complains of a syntax error when
performing the validation callback:
---
1) Error:
test_create(TasksControllerTest):
SyntaxError: compile error
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:
syntax error
errors.add("project", "is not included in the list") unless
([#<Project:0xb7d47a88 @attributes={"name"=>"First
Project",
"id"=>"1", "archived"=>"0",
"description"=>"The first project.",
"default_iteration_length"=>"14"}>,
#<Project:0xb7d47a24
@attributes={"name"=>"Second Project",
"id"=>"2", "archived"=>"0",
"description"=>"The second project",
"default_iteration_length"=>"14"}>]).include?(project)
^
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:in
`run_validations''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:in
`run_validations''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:374:in
`each''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:374:in
`run_validations''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:337:in
`valid_without_callbacks''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/callbacks.rb:294:in
`valid?''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:322:in
`save_without_transactions''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
`save''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
`transaction''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:87:in
`transaction''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:113:in
`transaction''
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
`save''
./test/functional/../../config/..//app/controllers/iterations_controller.rb:21:in
`create''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:607:in
`send''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:607:in
`perform_action_without_filters''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/filters.rb:294:in
`perform_action_without_benchmark''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
`perform_action_without_rescue''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
`measure''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
`perform_action_without_rescue''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/rescue.rb:75:in
`perform_action''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:274:in
`send''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:274:in
`process''
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/test_process.rb:246:in
`process''
./test/functional/tasks_controller_test.rb:42:in `test_create''
---
--
Regards,
John Wilger
-----------
Alice came to a fork in the road. "Which road do I take?" she asked.
"Where do you want to go?" responded the Cheshire cat.
"I don''t know," Alice answered.
"Then," said the cat, "it doesn''t matter."
- Lewis Carrol, Alice in Wonderland
Steve Kellock
2005-Feb-09 16:52 UTC
Re: [DEFECT] ''validates_inclusion_of'' not working as expected (couldn''t post to Trac as it gave me an error)
Ya...
It has to do with the presence of .inspect on line 270 of
activerecord/lib/active_record/validations.rb.
A workaround could be:
validates_inclusion_of :project_id, :in => Project.find_all.collect{
|p| p.id }
But if that scares you (which it may if you have no projects), you''ll
have to resort to old-school custom validation.
I''ll check out some alternatives to using .inspect as soon as I have
time. Hopefully you or somebody will beat me to the punch tho... ;-)
Steve
On Wed, 9 Feb 2005 11:09:20 -0500, John Wilger
<johnwilger-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> Hello,
>
> I tried to post this as a bug on the trac site, but whenever I hit
> submit, I got the error message:
>
> ---
> Precondition Failed
>
> The precondition on the request for the URL /newticket evaluated to false.
> ---
>
> Anyway...
>
> Let''s say I have the following model classes:
>
> ---
> class Project < ActiveRecord::Base
> has_many :tasks
> end
>
> class Task < ActiveRecord::Base
> belongs_to :project
> validates_inclusion_of :project, :in Project.find_all
> end
> ---
>
> You would expect the validation to work properly (Project.find_all
> returns an enumerable), but Ruby complains of a syntax error when
> performing the validation callback:
>
> ---
> 1) Error:
> test_create(TasksControllerTest):
> SyntaxError: compile error
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:
> syntax error
> errors.add("project", "is not included in the list")
unless
> ([#<Project:0xb7d47a88 @attributes={"name"=>"First
Project",
> "id"=>"1", "archived"=>"0",
"description"=>"The first project.",
> "default_iteration_length"=>"14"}>,
#<Project:0xb7d47a24
> @attributes={"name"=>"Second Project",
"id"=>"2", "archived"=>"0",
> "description"=>"The second project",
>
"default_iteration_length"=>"14"}>]).include?(project)
> ^
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:in
> `run_validations''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:378:in
> `run_validations''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:374:in
> `each''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:374:in
> `run_validations''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:337:in
> `valid_without_callbacks''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/callbacks.rb:294:in
> `valid?''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/validations.rb:322:in
> `save_without_transactions''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
> `save''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
> `transaction''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:87:in
> `transaction''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:113:in
> `transaction''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/activerecord-1.6.0/lib/active_record/transactions.rb:121:in
> `save''
>
./test/functional/../../config/..//app/controllers/iterations_controller.rb:21:in
> `create''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:607:in
> `send''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:607:in
> `perform_action_without_filters''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/filters.rb:294:in
> `perform_action_without_benchmark''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
> `perform_action_without_rescue''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
> `measure''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/benchmarking.rb:30:in
> `perform_action_without_rescue''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/rescue.rb:75:in
> `perform_action''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:274:in
> `send''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/base.rb:274:in
> `process''
>
/usr/local/ruby/lib/ruby/gems/1.8/gems/actionpack-1.4.0/lib/action_controller/test_process.rb:246:in
> `process''
> ./test/functional/tasks_controller_test.rb:42:in `test_create''
> ---
> --
> Regards,
> John Wilger
>
> -----------
> Alice came to a fork in the road. "Which road do I take?" she
asked.
> "Where do you want to go?" responded the Cheshire cat.
> "I don''t know," Alice answered.
> "Then," said the cat, "it doesn''t matter."
> - Lewis Carrol, Alice in Wonderland
> _______________________________________________
> Rails mailing list
> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>