我目前有五个布尔属性。我对它们进行了自定义验证:
def limit_impacts
i = 0
choices = [self.first_attr, self.sec_attr, self.third_attr, self.fourth_attr, self.fifth_attr]
choices.each do |choice|
if choice == true
i+=1
end
end
if i > 2
errors[:base] << ("There must be one or two impacts.")
end
end
想法是测试是否有两个以上设置为true,如果是,则设置错误。我设置 a 是:base error
因为它与一个属性没有直接关系。
我只是为了验证而这样做:validate :limit_impacts
以及处理这个的视图部分:
= f.input :first_attr, :as => :boolean
= f.input :sec_attr, :as => :boolean
= f.input :third_attr, :as => :boolean
= f.input :fouth_attr, :as => :boolean
= f.input :fifth_attr, :as => :boolean
问题是,当我检查超过 2 个复选框时,条目没有保存,这很正常,但视图中没有显示错误消息。
我究竟做错了什么 ?
顺便说一句,我在 rails 控制台中对其进行了测试:
MyModel.errors[:base]
=> ["There must be one or two impacts."]
而且这种语法也不起作用:
errors.add :base, "message"
编辑:这是我的控制器。这是关于编辑方法的。
def edit
@page_title = t('projects.edit.title')
@project = Project.find(params[:id])
@steps = @project.steps
@rewards = @project.rewards
@project_bearer = @project.user
end
与这些属性无关。
当我尝试通过 rails 控制台创建项目时,它返回 false :
2.0.0p247 :001 > t = Project.create(:social_influence => true, :environmental_influence => true, :economical_influence => true)
=> <Project all my attributes ..>
2.0.0p247 :002 > t.save
(1.2ms) BEGIN
(2.0ms) ROLLBACK
=> false
解决方案 :
问题是我的更新方法,在渲染和重定向之间。感谢@delba,我解决了它。如果您想查看解决方案,请在他的答案的评论中进行讨论。