Простые пользовательские проверки моделей в Rails - PullRequest
2 голосов
/ 21 января 2011

Я хочу сделать две простые пользовательские проверки:

if project.end < project.start, raise an exception.
if project.start, set project.active to equal true

Мой код (возможно, ужасно неправильный) не работает:

class Project < ActiveRecord::Base
  before_save :check_data # now changed to before_validation

  def check_data
     if end < start
         errors.add(:base, 'Project end date must be after project start date.')
     end
     if start
         active = true
     end
  end

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

Кроме того, поле active не изменяется в базе данных.


Код контроллера:

@project = Project.find(params[:id])
if @project.update_attributes(params[:project])
    redirect_to home_url   
else
    flash[:error] = "There was an error saving your form."
    redirect_to edit_project_url
end

Обновление - Как изменить поле из модели?

Я изменил приведенный выше код до before_validation, но поле active по-прежнему не изменяется в базе данных.Как я могу заставить работать приведенный выше код модели?

Ответ: Используйте self.active.

Ответы [ 2 ]

5 голосов
/ 21 января 2011

Чтобы условие ошибки работало правильно, используйте before_validation вместо before_save.

Условие успеха не работает правильно, потому что в присваивании active есть локальная переменная, а неатрибут модели.Вы должны явно использовать «себя» здесь как self.active = true.

4 голосов
/ 21 января 2011

Возможно, вам следует использовать before_validation, если вы проверяете. Причина в том, что если у вас есть другие проверки, которые не пройдены, ваши check_data никогда не будут запущены, и поэтому пользователь никогда не увидит эти ошибки. Это может привести к ситуации, когда они вводят данные проекта, получают ошибку проверки, исправляют эту ошибку, а затем запускаются ваши check_data и сообщают им о другой ошибке проверки. Если вы используете before_validation, они сразу увидят все ошибки.

Я не знаю, поможет ли это на самом деле исправить ошибку, с которой вы столкнулись при активном несохранении, но ошибка, которую вы заметили при ошибках, не отображаемых в форме, связана с использованием redirect_to edit_project_url - вам, вероятно, следует использовать

render :edit

от вашего действия по обновлению и

render :new

из вашего действия создания. errors на самом деле является частью объекта @project, поэтому, когда вы перенаправляете (вместо рендеринга) новое действие, создается новый объект. При перенаправлении на страницу редактирования существующий объект загружается из базы данных. Вот как ваш массив ошибок исчезает. Если вы выполняете рендеринг вместо перенаправления, ваши ошибки останутся на объекте и будут отображаться в вашем представлении (при условии, что вы все правильно настроили).

Надеюсь, это поможет, удачи в определении проблемы с активным состоянием!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...