2010-04-02 57 views
1

所以,我想让用户看到一条错误消息,如果他提交了一条评论,并且:name是空的(典型的错误消息,不需要帮助)。不过,我希望允许用户在收到“我们喜欢所有评论都有名字”的通知后跳过该验证。因此,他只提交一次注释,看到通知,然后可以再次提交表单,如果他真的不想添加名称,并且会跳过validates_presences_of:name。有没有办法只验证一次validates_presence_of? (一旦用户被通知,跳过验证)

但是,我不知道如何去做这件事。我想过检查以查看请求来自哪里,但在创建之后,将错误交给“新”操作,这与实际的“新”注释相同。

然后我想着检查是否存在闪存[错误],但这不起作用,因为有其他验证评论必须通过。

最后,我想过尝试一个

validates_presences_of:名称,:除非 =>:通知

,但不知道如何定义通知。我真的很讨厌问这样一个开放式问题,但不知道从哪里开始。那么,有没有办法只检查一次特定的验证?

编辑:这是我的控制器

@comments = params[:comments].values.collect{ |comment| current_user.comments.create(comment) }.reject { |p| p.errors.empty? } 

和我的观点:

<% @comments.each_with_index do |comment, index| %> 
    <% fields_for "comments[#{index}]", comment do |f| %> 
     <%= render :partial => 'form', :locals => { :f => f } %> 
    <% end %> 
<% end %> 

(中东西 '形' 部分只是基本f.label,f.text_area东西)

我在想,这个问题真的在我看来,因为它处理了一系列评论。应该在“形式”部分还是在“新”视图中定义通知的隐藏字段?我的想法是,局部的每次迭代不需要通知hidden_​​field,而只需要整体形式本身。但后来我不知道。

回答

3

你的解决方案应该可以正常工作。只需将attr_accessor :notified添加到模型中,并为其添加一个隐藏字段,格式如下:form.hidden_field :notified。然后,在控制器操作中,如果验证失败,请在重新显示视图之前设置@comment.notified = true

编辑:是的,有多个评论它可能是更容易只是做

@notified = true 
控制器else语句

,然后添加

<%= f.hidden_field :notified, :value => @notified %> 

到窗体部分。然后,每个评论将有notified设置为true,并将跳过该验证。

+0

我认为这肯定会解决,非常感谢mckeed。但是,你会如何定义:notifed?我应该在模型的底部创建一个新的定义,就像回调?如果是这样,它应该如何定义?或者,如果它是一个Proc.new在:except语句?对不起,但我还是有点新的轨道,我真的不知道如何定义它。 (此外,我的评论控制器接受和评论数组,但我认为这不会真的很重要,因为我认为我可以做@commentS。通知=真)真的很感激你的答案,再次感谢你mckeed。 – GoodGets 2010-04-03 23:51:36

+1

您需要添加到模型中的唯一东西是attr_accessor:notification',该行定义了'notifications'和'notifications ='方法,因此您可以执行':unless =>:notifications'和'@comment.notified = TRUE'。我不确定你对这批评论意味着什么。每个人都有'name'字段,还是一个不同的模型?如果您在创建它们的地方发布控制器方法,我可以进一步帮助您。 – mckeed 2010-04-06 05:38:04

+0

嘿mckeed,谢谢你回到我身边。每个评论都有一个名称字段以及一个文本字段。我编辑了我的问题以包含我的控制器。它收集所有评论,将它们分配给current_user,然后拒绝任何未通过验证的评论。接下来是一个简单的if/else语句,就像@ comments.empty?一样,用户得到一个“成功”的消息,否则错误会被标记出来并重新显示表单。在这个声明中,我将通知设置为true。不过,我认为我的问题可能在于我的“观点”,所以我也包括了这一点。我真的很感激帮助。谢谢。 – GoodGets 2010-04-07 02:31:36