Neil Middleton
Neil Middleton

Reputation: 22238

Using Rails form helpers on non-existent methods

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?

Upvotes: 5

Views: 904

Answers (2)

James A. Rosen
James A. Rosen

Reputation: 65232

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.

Upvotes: 1

Benjamin Manns
Benjamin Manns

Reputation: 9148

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.

Upvotes: 4

Related Questions