2010-02-19 5 views
4

Обычно, при использовании помощников формы в Rails, каждое поле напрямую коррелирует с методом на соответствующем объекте.Использование помощников формы Rails для несуществующих методов

Однако у меня есть форма (пользовательская регистрация), которая должна включать поля, которые не являются частью самой пользовательской модели (например, данные карты), но должны появиться.

Как я могу создать форму, чтобы я мог получить необходимые поля и проверить их, как мне нужно (чтобы они соответствовали всем моим другим валидации), не загрязняя мою пользовательскую модель?

ответ

3

Я не уверен, что вы подразумеваете под «грязной» моделью пользователя, но вы можете сделать это, используя attr_accessor method. Это позволит создать атрибут для модели, которая может быть использована для валидаций:

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

Чтобы только запустить проверку в определенное время, вы могли бы использовать :if условие:

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

Вы также можете использовать метод класса, например: :if => :payment_complete. С их помощью вы сможете достичь необходимой функциональности. Насколько я знаю, нет более лаконичного пути.

+0

По существу, я не создаю форму, которая напрямую коррелирует с рассматриваемой моделью. Например, форма регистрации может включать некоторые пользовательские свойства и некоторые свойства «выбросить» (например, те, которые вы можете запустить на шлюзе CC, а затем забыть). Если я создал атрибуты в моей модели пользователя, мне всегда нужно было предоставить эти свойства для проверки, тогда как я хочу только проверить эти элементы в этой единственной форме в этом единственном месте. –

+0

Я добавил информацию о состоянии: if, которое может быть тем, что вы ищете. –

1

У Yehuda Katz есть great explaination, как вы можете использовать ActiveModel, чтобы сделать произвольный класс совместимым с помощниками формы Rails. Это работает, только если вы на Rails 3.

Если вы не живете на переднем крае, смотреть Railscasts episode 193, "Tableless Model", который описывает, как вы можете создать класс, который крякает достаточно как ActiveRecord::Base, что он работает с form_for.