2013-07-24 2 views
0

Из-за некоторых проблем я работал с системой, которая использовала модель на многих страницах, где ее проверка ее содержимого модели варьируется в зависимости от шагов контроллера.Модели Rails применяют проверки на основе контроллера

E.g. когда @step = 1, модель должна быть validates_precense_of: name, но вы только validates_precense_of: age до @step = 2

Однако, поскольку модель рельсов не может читать сеансовые или глобальные переменные, как я могу применить это?

+0

'@ step' не глобальный, но в сторону, не является шагом частью модели? Если нет, почему бы и нет? Его не нужно сохранять, просто сделайте его псевдо-атрибутом. –

+0

Нет, в принципе, у меня много просмотров, которые используют атрибуты кросс-моделей, например, для первого представления потребуется некоторая информация о драйвере: name, если второе представление потребует от пользователя ввода возраста. когда я отправляю первый вид, я хочу, чтобы модель проверяла: name, но не проверяла возраст, так как его не требуется до второго представления. но когда я нажимаю submit для второго представления, я не хочу проверять возраст – phil88530

+0

, что такое @step? Это модель? Переменная для определения вида? Что делает @step в приложении? Редактирование: вы ответили, прежде чем я поставил этот комментарий ... –

ответ

0

Я считаю, что Дэйв говорит это

class Model 
    attr_accessor :step 
    validate_presence_of :name, if: { |m| m.step == 1 } 
    validate_presence_of :age, if: { |m| m.step == 2 } 
end 

class Controller 
    def first_step 
    @model = Model.new(params[:model].merge(step: 1)) 
    if @model.valid? 
    .... 
    end 
    def second_step 
    @model.update_attributes(params[:model].merge(step: 2)) 
    if @model.valid? 
    .... 
    end 
end