Rails中的简单自定义模型验证

ssc*_*rus 2 validation model ruby-on-rails ruby-on-rails-3

我想做两个简单的自定义验证:

if project.end < project.start, raise an exception.
if project.start, set project.active to equal true
Run Code Online (Sandbox Code Playgroud)

我的代码(可能非常不正确)不起作用:

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
Run Code Online (Sandbox Code Playgroud)

错误正在被添加,但我没有被带回到带有错误消息的表单 - 在用户端似乎一切都很好.

此外,该字段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
Run Code Online (Sandbox Code Playgroud)

更新 - 如何更改模型中的字段?

我将上面的代码更改为before_validation,但该active字段仍未在数据库中更改.如何使上述模型代码有效?

答:使用self.active.

Ben*_*Lee 5

要使错误条件正常工作,请使用before_validation而不是before_save.

成功条件不正常,因为active赋值是局部变量,而不是模型属性.你必须在这里明确使用"自我" self.active = true.