2012-06-30 258 views
5

我是一个超级红宝石/ rails新手,所以你将不得不裸露在这里。Ruby on Rails验证错误

我已经设置了一个需要电子邮件地址并保存它的小应用程序,我已经在模型上设置了验证(唯一且有效的电子邮件)并且这两者都可以工作。

我使用下面的代码,试图保存电子邮件,如果它已经存在或者它不是一个有效的格式,它需要没有停止,并设置错误消息

def create 
    interest = KnownInterest.new(:email => params[:email]) 
    if(interest.valid? and interest.save) 
     flash[:notice] = "Thanks for showing interest, We'll be in touch with updates." 
    else 
     flash[:notice] = interest.errors.messages 
    end  
    redirect_to action: "index" 
end 

这个吐出[“电子邮件有效“],我如何得到这是一个字符串(不是我想是一个数组,纠正我,如果我错了)

非常感谢

回答

9

如果你只是想第一条消息,然后interest.errors.messages.first。如果你想要它们,那么像interest.errors.messages.join(", ")这样的东西将把所有的消息分组成一个字符串。

但是,您可能需要刷新ActiveRecord验证和错误。
这里是一个不错的指南:

http://guides.rubyonrails.org/active_record_validations_callbacks.html

阅读至少:

+4

这实际上应该是'interest.errors.full_messages.join( '')' - 作者注'full_messages',而不是'messages'(至少是这样的case在Rails 3.2) – Tinynumbers

4

.messages将返回所有错误的数组。即使它只是一个。

因此,要正确地显示他们,这样做在你的观点:

- for error in flash[:notice] do 
    = error 

或者如果你喜欢html.erb

<%- for error in flash[:notice] do %> 
    <%= error %> 
<%- end %> 
-1

interest.errors.messages.join(<any concatenating character>)将创建一个字符串拼接你的数组元素。

您可以使用字符串 - 例如“,”,“:”或几乎任何要连接的字符串。

+1

@ equipment.errors.messages.join(“,”)=>未定义的方法'加入'为# notaceo

0

对我来说这一次的工作:

<html> 
    <body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
     <% flash.each do |key, value| %> 
     <div class="alert alert-<%= key %>"><%= value %></div> 
     <% end %> 
     <%= yield %> 
     <%= render 'layouts/footer' %> 
     <%= debug(params) if Rails.env.development? %> 
    </div> 

    </body> 
</html>