Search code examples
ruby-on-railsrubyhelperactionview

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?


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.