如何处理rails的多态关联中的错误消息?

时间:2017-07-05 19:39:14

标签: ruby-on-rails polymorphic-associations

我一直关注此网站上的多态关联教程https://www.richonrails.com/articles/polymorphic-associations-in-rails

不幸的是,作者没有提供本教程的后半部分。

我想知道处理错误消息的正确语法是什么。

在interaction / new.html.erb中,

<%= form_form [@context, @interaction] do |f| %>
  <% render 'shared/errors', object: f.object%>

在shared / _errors.html.erb中,

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>
    <ul>
     <% object.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
     <% end %>
    </ul>
 </div>
<% end %>

当用户尝试输入错误的新交互时,表示多余的字数限制,应该告诉用户。但是,什么都不会发生。

如果不是多态关联,那很容易,&lt;%= form_form @interaction do | f | %GT;会工作的。

我试过了     &lt;%= form_form [@ context,@ interaction] do | f | %GT;       &lt;%render'shared / errors',object:f。[@ context,@ interaction]%&gt; 它不起作用。

对我来说有什么线索吗?提前致谢! (ruby 2.3.3,rails 5.0.1)

1 个答案:

答案 0 :(得分:0)

今天想通了!可能无法最好地解释这一点,但问题是,当发生错误并重新呈现表单时,错误将保存到调用的对象(@interaction)上(@ interaction.save)。它创建此错误对象ActiveModel :: Errors:0x007f62d4221698。如果您在创建方法中“ logger.debug @ interaction.errors.full_messages”,则可以看到错误消息

if @interaction.save
  redirect_to context_url(context), notice: "The interaction has been successfully created."
else
  logger.debug @interaction.errors.full_messages
  render 'new'
end

当您使用多个变量调用form_for [@context,@interaction]时,表单构建器看不到先前的@interaction错误ActiveModel :: Errors:0x007f62d4221698,我不知道确切的原因,但是表单构建器似乎创建一个没有错误的新ActiveModel :: Errors。

您只需要使用对象@interaction指定f.object,该对象具有create方法中的错误对象。您可以在下面看到解决方案。

  <%= form_form [@context, @interaction] do |f| %>
  <% render 'shared/errors', object: @interaction %>