我一直关注此网站上的多态关联教程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)
答案 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 %>