Ruby on rails Rails、自定义验证和错误未显示

Ruby on rails Rails、自定义验证和错误未显示,ruby-on-rails,error-handling,formtastic,Ruby On Rails,Error Handling,Formtastic,我目前有五个布尔属性。我对它们执行自定义验证: 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

我目前有五个布尔属性。我对它们执行自定义验证:

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
问题是,当我选中两个以上的复选框时,entrie没有保存,这是正常的,但是视图中没有显示错误消息

我做错了什么

顺便说一下,我在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 
2.0.0p247:001>t=Project.create(:社会影响=>true,:环境影响=>true,:经济影响=>true)
=> 
2.0.0p247:002>t.save
(1.2ms)开始
(2.0ms)回滚
=>错误
解决方案:

问题是我的更新方法bewteen render和redirect。多亏了@delba,我才解决了这个问题。
如果你想看到解决方案,在他的回答的评论中有一个讨论。

让我们从你的验证方法开始:

def limit_impacts
  choices = [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr]
  errors[:base] << "There must be one or two impacts." if choices.count(true) > 2
end
def限制\u影响
选项=[第一属性、第二属性、第三属性、第四属性、第五属性]
错误[:base]2
结束
干净多了,不是吗?:)


您能给我们看一下显示错误的布局/视图位吗?然后我将更新答案。

让我们从验证方法开始:

def limit_impacts
  choices = [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr]
  errors[:base] << "There must be one or two impacts." if choices.count(true) > 2
end
def限制\u影响
选项=[第一属性、第二属性、第三属性、第四属性、第五属性]
错误[:base]2
结束
干净多了,不是吗?:)


您能给我们看一下显示错误的布局/视图位吗?然后我将更新答案。

在包含表单的视图中,确保显示错误:

<%= form_for @my_model do |f|
  <% if @my_model.errors.any? %>
    <ul class="errors">
      <% @my_model.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>

  <%# the rest of the form %>
<% end %>
在您的模型中:

validate :limit_impacts

private

def limit_impacts
  if [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr].count(true) > 2
    errors[:base] << "There must be one or two impacts."
  end
end
验证:限制\u影响
私有的
def限制\u影响
如果[第一个属性、第二个属性、第三个属性、第四个属性、第五个属性]。计数(真)>2

错误[:base]在包含表单的视图中,确保显示错误:

<%= form_for @my_model do |f|
  <% if @my_model.errors.any? %>
    <ul class="errors">
      <% @my_model.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  <% end %>

  <%# the rest of the form %>
<% end %>
在您的模型中:

validate :limit_impacts

private

def limit_impacts
  if [first_attr, sec_attr, third_attr, fourth_attr, fifth_attr].count(true) > 2
    errors[:base] << "There must be one or two impacts."
  end
end
验证:限制\u影响
私有的
def限制\u影响
如果[第一个属性、第二个属性、第三个属性、第四个属性、第五个属性]。计数(真)>2


错误[:base]是的,更干净了,谢谢你。我的观点分为部分观点,但我会尝试将它们混合在一起,以便向您展示更多。我再次阅读了您的最后一句话,我误解了它。目前我自己不处理错误,Rails在其他字段不尊重验证时为我做这件事。我只有一个自定义验证。是的,更干净了,谢谢。我的观点分为部分观点,但我会尝试将它们混合在一起,以便向您展示更多。我再次阅读了您的最后一句话,我误解了它。目前我自己不处理错误,Rails在其他字段不尊重验证时为我做这件事。我只有一个自定义验证。方法
错误。add
适用于特定属性,而不是
:base
。我不确定这一点,请看您是否需要这样使用它:
model\u instance.errors.add(:attribute\u name,“错误消息,如‘不能为空’)
是的,您是对的。但是我检查了方法和
errors.add
规范化
model.errors.full_消息的消息(在调用
errors[:attribute]之前)方法
错误。add
适用于特定属性,而不是
:base
。我不确定这一点,请看您是否需要这样使用:
model\u instance.errors.add(:attribute\u name,“错误消息,如‘不能为空’)
是的,你是对的。但是我检查了方法和
错误。添加
规范化
模型的消息。错误。完整消息
(在调用
错误[:属性]之前)您的第一列\u attr..第五列\u attr的类型是什么?您可以发布未保存实例的日志吗?所有这些都是复选框,属性都是布尔值。如何发布未保存实例的日志?我怀疑这是控制器的问题。启动rails服务器并在Web浏览器中创建
my_model
有2个以上的
影响
。然后发布日志(终端上写的内容).Thank我在使用foreman和Unicorn,你还想要日志吗?如果你想要,我可以给你看控制器。是的。如果请求没有记录在任何地方,请给我看控制器+路由。真的。Thank你的第一列属性是什么?第五列属性是什么?你能发布一个实例的日志吗?请不要全部保存hem是复选框,属性是布尔值。如何发布未保存的实例的日志?我怀疑这是控制器的问题。启动rails服务器并在Web浏览器中创建一个具有2个以上
影响的
my_model
实例。然后发布日志(在终端上写入的内容).Thank我在使用foreman和Unicorn,你还需要日志吗?如果你需要,我可以给你看控制器。是的。如果请求没有记录在任何地方,请给我看控制器+路由。真的吗。谢谢