Question

Normally, when using form helpers in Rails, each field directly correlates to a method on the appropriate object.

However, I have a form (user signup) that needs to include fields that are not part of the user model itself (for instance, card details) but need to appear.

How can I build the form so that I can get the necessary fields, and validate them as I need to (so that it fits with all my other validations) without dirty-ing my user model?

Was it helpful?

Solution

I'm not sure what you mean by "dirty-ing" your user model, but you can do this using the attr_accessor method. This will allow you to create an attribute for the model that can be used for validations:

class Widget < ActiveRecord::Base
  attr_accessor :confirmation_email
  validates_length_of :confirmation_email, :within => 1..10
end

To only run the validation at certain times, you could use an :if condition:

validates_length_of :confirmation_email, :within => 1..10, :if => Proc.new { |widget| widget.creation_step > 2 }

You can also use a class method, like: :if => :payment_complete. With these you should be able to achieve the functionality you want. As far as I know there isn't any more concise way.

OTHER TIPS

Yehuda Katz has a great explaination of how you can use ActiveModel to make an arbitrary class compatible with Rails' form helpers. That only works if you're on Rails 3, though.

If you're not living on the bleeding edge, watch Railscasts episode 193, "Tableless Model", which describes how you can create a class that quacks enough like ActiveRecord::Base that it works with form_for.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top