Сведения о вопросе

Codeliver

05:10, 26th August, 2020

Теги

Ruby   on   Rails    

Ruby on Rails 3 validation model

Просмотров: 254   Ответов: 5

Предположим у нас есть User модель и в ней есть first_name, last_name, email поля. Все они обязательные. Соотвественно в модели мы прописываем
что-то типа такого

validates :first_name, :presence => true
validates :last_name, :presence => true
validates :email, :presence => true

и все было бы хорошо если бы форма была на одной странице.
А теперь вопрос, как поступть с validation если форма для апдейта first_name и last_name на одной странице а email на другой.
По умолчанию так сказать на форме где first_name и last_name если ее засабмитеть то будет ошибка что мол email требуется и это верно (у меня же email на другой странице нужно обновлять), тоже самое и на форме email где валидация будет просить first_name и last_name. Меня интересует как в Rails 3 корректно обрабатывать такую ситуацию.

К примеру в ASP.NET MVC я делаю как бы child ViewModel непосредственно для конкретного View проверяю поля и потом делаю маппинг свойств с родительской моделью. Как правильно это сделать в Rails 3?



  Сведения об ответе

dump

21:00, 22nd August, 2020

Если я правильно понял ваш алгоритм, то сначала у вас создаётся запись с first_name и last_name, а потом уже в существующей записи обновляется поле email.
Тогда попробуйте
validates :first_name, :presence => true
validates :last_name, :presence => true
validates :email, :presence => true :on => :update
И при добавлении поля email загружать уже существующий объект.
Тогда на первой форме у вас будет будут проверяться первые два поля, вы сохраните объект.
Потом, на второй форме, вы загрузите объект с уже заполненными полями first_name и last_name, и обновите его. А при обновлении сработает валидация на поле email.


  Сведения об ответе

JUST___

04:20, 6th August, 2020

Немного устаревший, но позволяющий понять, принцип railscast на эту тему: railscasts.com/episodes/217-multistep-forms


  Сведения об ответе

padenie

06:49, 23rd August, 2020

Я делал state_machine и валидаторы в зависимости от state

В примере на github.com прямо показано, как такое делать

state :first_gear, :second_gear do
validates_presence_of :seatbelt_on
end


  Сведения об ответе

ITSME

15:23, 20th August, 2020

средствами чистого Rails в рабочей системе

with_options :if => «cause == 1» do |client|
client.validates :prepay, :cost, :birthday, :phone1, :contract_date, :vin, :adress, :presence => 'true'
client.validates_presence_of :id_series, :id_number, :id_dep
client.validates_format_of :id_series, :id_number, :with => /[\d\s]/
client.validates_presence_of :fio
client.validates :car, :presence => true
end

with_options :if => 'cause == 5' do |client|
client.validates_presence_of :fio, :manager, :trade_in_price, :trade_in_desc
client.validates_associated :used_car

end


  Сведения об ответе

PIRLO

11:33, 22nd August, 2020

Условия это зло. Модель от этого неимоверно разрастется. Намного проще сделать новый уровень абстракции в приложении и назвать его, например, types. Итак, создаем два типа пользователя:
UserRegisterType < User и UserEmailSetterType < User(названия придумйте сами). Теперь, в контексте этих унаследованных моделей можно проставить нужные нам attr_accessible, validates, и прочие штуки. Более подробно о данном решении и подводных камнях можно почитать в блоге Кирилла Мокевнина


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться