2012-07-09 143 views
1

我的问题如下:检查一个属性是否有效

我有一个表单视图,它需要在提交后显示成功和失败图标。 在提交之前,只需显示没有成功和失败图标的表单。

我们可以做这几种方式的时候是这样的形式:如果请求是一个POST

<%= form_for @resource do |f| %> 
    <div class='<%= set_class @resource, :name %>'> 
     Name: <%= f.text_field :name %> 
    </div> 
<% end %> 

检查:

def set_class(record, attribute) 
     if request.post? 
      if record.errors[attribute].any? 
       return "FAILED" 
      else 
       return "SUCCESS" 
      end 
     end 
     # If not submitted, we don't want a class 
    end 

设置验证后标志(我们可以替代request.post?在以上解决方案用record.tried_to_validate):

class MyModel < ActiveRecord::Base 

     after_validation :set_tried_to_validate 

     attr_accessor :validated 

     def set_validated 
      @tried_to_validate = true 
     end 

    end 

但是我真的不喜欢ke这些解决方案..

是否有一个内部的Rails方法来检查验证过程是否完成?

+1

你能详细说明验证和通过的区别吗? – 2012-07-09 14:12:47

+0

已验证的属性已尝试保存..通过和失败的属性在保存后是否有效..未验证的属性尚未尝试保存,它们是第一次被用户查看.. – 2012-07-09 14:27:51

回答

4

你可以先测试其有效性..

@form.valid? 

将生成存储在您的@form“错误”的错误。要查看是否在特定领域存在错误,

@form.errors[:some_field] 

在您的形式,你可以简单地做!

<% if @form.errors[:some_field].empty? %> 
    Valid 
<% end %> 

只要某些领域产生错误,整个形式将是有效的?所以你会恢复显示表单(:新),你可以'有效'或复选标记。

+0

我知道,但是当第一次构建表单时(没有任何验证)我不想查看属性是否通过了验证..我不想在那里使用'valid?',因为所有验证都是在用户拥有之前完成的做了任何事情..如果用户填写了表单的一些领域并提交了它,那么它需要显示一个勾号或一个十字。 – 2012-07-09 14:29:56

+0

还是有点困惑。原谅我。如果表格是第一次构建,我会认为没有什么是有效的,绝对有效的?不会是真的。 – 2012-07-09 17:58:31

+0

对不起,可能是我解释错了。当我第一次创建表单时调用'valid?',一切都是无效的,我不想向用户显示。所以我需要只有在表单已经提交并试图验证字段时才调用'errors.any?'或'valid?'。 – 2012-07-10 10:49:24

0

我认为你正在寻找类似客户端验证的东西,如果想验证在窗体上显示内联。 http://railscasts.com/episodes/263-client-side-validations

编辑

如果你想捕捉的3个阶段,你可以在你的数据库保存。新建,验证,完成并仅使用回调保存每个阶段并将默认设置为新。 (您将有变化的验证属性字符串的数据类型)

after_validation更新属性为“验证”

after_save的更新属性设置为“已完成”

然后,你可以,如果ELSIF其他使用条件来检查该属性的值并呈现刻度和交叉。显然,这不是很漂亮,你应该只使用有效的?和错误?助手。

+0

我已经验证了所有验证。我需要知道的是记录是否被验证。我现在使用的解决方案是一种名为'after_validation'的方法,它将一个名为'validated'的属性设置为true。但我不太喜欢这个解决方案.. – 2012-07-09 15:07:19

+0

你想如何在视图中显示验证?你有没有在你的表单中调用error_messages? – 2012-07-09 15:09:10

+0

是的,好吧,就像这样:'raw ff.object.errors [field_name] .collect {| e | content_tag(:div,e,class:“error”)} .join',但在此之后显示字段..并且它需要一个类'bad'(如果无效),'good'(如果有效)或没有课,如果还没有验证(第一次查看).. – 2012-07-09 15:12:12

相关问题