错误消息来自这段代码?

时间:2014-04-18 01:54:44

标签: ruby-on-rails

简介所有这些代码均来自http://guides.rubyonrails.org/getting_started.html

有问题的消息:

1 error prohibited this article from being saved:

Title is too short (minimum is 5 characters)

代码第1部分定义参数

class Article < ActiveRecord::Base
  validates :title, presence: true,
                    length: { minimum: 5 }
end

代码第2部分错误消息

<% if @article.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@article.errors.count, "error") %> prohibited
      this article from being saved:</h2>
    <ul>
    <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>

2 个答案:

答案 0 :(得分:2)

错误消息来自您的控制器和型号的组合。

def new
  @article = Article.new
end

def create
  @article = Article.new(article_params)

  if @article.save # the magic happens here
    redirect_to @article
  else
    render 'new'
  end
end

private

def article_params
  params.require(:article).permit(:title, :text)
end

当你打电话给@ article.save时,你问你的模特'这篇新文章的标题长度至少为5个字符?'。如果是,则文章将保存到数据库中,您将被重定向到@article。

if @article.save
  redirect_to @article

如果没有,它将使用@ articles.errors.messages

重新渲染新页面(渲染'new')
else
  render 'new'
end

使您的文章模型化实例变量@article允许您将模型所具有的任何数据/方法携带到视图中。在这种情况下,您可以将错误消息带入新表单。你的新表格代码在这里检测@article是否有错误,也就是说如果调用@ article.errors.any?返回大于0的消息数组。

<% if @article.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@article.errors.count, "error") %> prohibited
      this article from being saved:</h2>
    <ul>
    <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

所以在你的情况下,你的标题太短了。这段代码接受了这个单一错误,对你的h2标签的消息使用复数魔术,然后列出@ articles.errors.full_messages.each块中的每个错误。

答案 1 :(得分:1)

在这种情况下,Article是ActiveRecord对象。这意味着它继承了某些行为(能力)。在这种情况下,当提交的标题不符合“验证”时。在代码部分1中的行,它向文章添加了错误操作。

在您的代码的第2部分之后,&#39; full_messages&#39;我已经提到的错误正在调用行动。这就是你所询问的信息来自哪里。在rails控制台中尝试它并尝试保存一个没有通过验证的对象。然后在其上调用@ article.errors.full_messages操作并查看。

为了扩展一点,“错误”和“错误”这里将是ActiveRecord错误对象。 full_messages几乎是一个包含每个错误文本的数组(例如&#34;标题太短。&#34;