validates presence of foreign key fails in nested form

23 views
Skip to first unread message

Javix

unread,
Mar 25, 2013, 11:03:29 AM3/25/13
to rubyonra...@googlegroups.com
I'm using accepts_nested_attributes as follows:

class Timesheet < ActiveRecord::Base
  attr_accessible :status, :user_id, :start_date, :end_date, :activities_attributes
  has_many :activities, dependent: :destroy
  has_many :time_entries, through: :activities
  accepts_nested_attributes_for :activities, allow_destroy: true
end

class Activity < ActiveRecord::Base
  attr_accessible :task_id, :timesheet_id, :time_entries_attributes
  validates :task_id, presence: true, uniqueness: { scope: 'timesheet_id'}
  belongs_to :timesheet
  belongs_to :task
  has_many :time_entries, order: :workdate, dependent: :destroy

  accepts_nested_attributes_for :time_entries, allow_destroy: true, reject_if: proc { |a| a[:worktime].blank? }
end

As you see, I didn't define any validation for timesheet_id presence in Activity model. It works fine in the browser, but it is still possible to create an activity without timesheet_id assigned.

If I add:

validates :timesheet_id, presence: true

to the Activity model, I can't any more create a timesheet via browser. Any idea ?
Regards

Serguei Cambour

unread,
Mar 25, 2013, 4:06:25 PM3/25/13
to rubyonra...@googlegroups.com
Found the way to do that by using 'inverse_of' option (see below):

On 25 Mar 2013, at 16:03, Javix <s.ca...@gmail.com> wrote:

I'm using accepts_nested_attributes as follows:

class Timesheet < ActiveRecord::Base
  attr_accessible :status, :user_id, :start_date, :end_date, :activities_attributes
  has_many :activities, dependent: :destroy
  has_many :time_entries, through: :activities, inverse_of: :timesheet
  accepts_nested_attributes_for :activities, allow_destroy: true
end

class Activity < ActiveRecord::Base
  attr_accessible :task_id, :timesheet_id, :time_entries_attributes
  validates :task_id, presence: true, uniqueness: { scope: 'timesheet_id'}
  belongs_to :timesheet, inverse_of: :activities
  belongs_to :task
  has_many :time_entries, order: :workdate, dependent: :destroy, inverse_of: :activity

  accepts_nested_attributes_for :time_entries, allow_destroy: true, reject_if: proc { |a| a[:worktime].blank? }
end

As you see, I didn't define any validation for timesheet_id presence in Activity model. It works fine in the browser, but it is still possible to create an activity without timesheet_id assigned.

If I add:

validates :timesheet_id, presence: true

to the Activity model, I can't any more create a timesheet via browser. Any idea ?
Regards

--
You received this message because you are subscribed to a topic in the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/rubyonrails-talk/eWvjCoKY4fI/unsubscribe?hl=en-US.
To unsubscribe from this group and all its topics, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/BKWet3UydOsJ.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Reply all
Reply to author
Forward
0 new messages