Hi everyone, I hope someone can help me solve this problem. I have a model called Project with :has_many => :tasks. In the new Project form i allow the creation of 1 to n tasks on the fly thanks to accepts_nested_attributes_for, where the task model has some validations that block the creation of the new project if the required fields are not correct. This works just fine as it is supposed to work, but here''s the problem: At least one task needs to have some fields not empty, otherwise the project should not be created. It can be any of the tasks but it''s imperative that at least one of them has those attributes, for the other tasks these attributes are not required. Is there a way of doing that without strange hacks? Thanks in advance for your help -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 23/12/10 10:32, Serafino Picozzi wrote:> Hi everyone, > > I hope someone can help me solve this problem. > I have a model called Project with :has_many => :tasks. In the new > Project form i allow the creation of 1 to n tasks on the fly thanks to > accepts_nested_attributes_for, where the task model has some validations > that block the creation of the new project if the required fields are > not correct. > > This works just fine as it is supposed to work, but here''s the problem: > > At least one task needs to have some fields not empty, otherwise the > project should not be created. It can be any of the tasks but it''s > imperative that at least one of them has those attributes, for the other > tasks these attributes are not required. > Is there a way of doing that without strange hacks? > > Thanks in advance for your help >Hi Serafino, I am assuming that you are using Javascript. If that is the case, then you can find the solution here http://stackoverflow.com/questions/1704142/unobtrusive-dynamic-form-fields-in-rails-with-jquery All the best, Fidel. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Would this not be the proper solution ? User has many payments. I want the user to have at least one payment with an amount, before a user is valid. class User < ActiveRecord::Base default_scope :order => :id has_many :payments validate :has_one_complete_payment private def has_one_complete_payment errors.add(:base, :missing_complete_payment) unless payments.detect {|p| p.amount} end end $ cat config/locales/en.yml en: hello: "Hello world" activerecord: errors: models: user: attributes: base: missing_complete_payment: You need at least one payment with amount filled out That results in this behaviour: $ rails c Loading development environment (Rails 3.0.3) 001:0> user = User.new(:first_name => "Jon") => #<User id: nil, first_name: "Jon", last_name: nil, user_name: nil, testing: nil, created_at: nil, updated_at: nil> 002:0> user.valid? => false 003:0> user.errors => #<OrderedHash {:base=>["You need at least one payment with amount filled out"]}> 004:0> p1 = user.payments.build() => #<Payment id: nil, user_id: nil, testing: nil, created_at: nil, updated_at: nil, amount: nil> 005:0> user.valid? => false 006:0> user.errors => #<OrderedHash {:base=>["You need at least one payment with amount filled out"]}> 007:0> p2 = user.payments.build() => #<Payment id: nil, user_id: nil, testing: nil, created_at: nil, updated_at: nil, amount: nil> 010:0> user.valid? => false 011:0> user.errors => #<OrderedHash {:base=>["You need at least one payment with amount filled out"]}> 012:0> p2.amount = "123.45" => "123.45" 013:0> user.valid? => true 014:0> user.save => true 015:0> user.payments.inspect => "[#<Payment id: 1, user_id: 1, testing: nil, created_at: \"2010-12-23 21:57:01\", updated_at: \"2010-12-23 21:57:01\", amount: nil>, #<Payment id: 2, user_id: 1, testing: nil, created_at: \"2010-12-23 21:57:01\", updated_at: \"2010-12-23 21:57:01\", amount: #<BigDecimal:b6cbb554,''0.12345E3'',8(12)>>]" 015:0> HTH, Peter -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.