6

问题

我试图在我的视图中重用错误消息块。

下面是写在位置/_error_messages.html.erb 中的块

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

问题是我必须在每个模型中创建类似的局部视图,这有点用不同的对象重复相同的代码,即@user、@client 等。

补救

我在共享文件夹 shared/_error_messages.html.erb 中创建了一个 erb 并编写了以下代码。

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

然后在视图文件中。position/new.html.erb 我写了下面的代码

<div id="errorbox"> 
 <%= render "shared/error_messages" %>
 <%= error_message(@position) %>
</div>

这意味着现在我可以在所有创建和更新操作中使用相同的代码。

我想知道,这是正确的方法吗?或者还有其他选择吗?

4

3 回答 3

8

不,在视图中定义方法不是正确的方法。我认为你应该@position从你的第一个部分替换为以更通用的方式命名的局部变量,例如object并渲染这个部分:

<%= render 'shared/error_messages', object: @position %>

@position作为局部变量传递给局部变量object

于 2013-08-28T10:07:33.817 回答
3
<%= render partial: 'shared/error_messages', locals: {position: @position} %>

现在在_error_messages.html.erb共享文件夹的部分中,您可以使用该position变量。

有关更多帮助,请参阅http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html

于 2013-08-28T10:18:07.053 回答
1

这不是最好的方法。在您的第一个代码块中将 @position 替换为更通用的内容,例如“obj”(例如)。所以它看起来像这样。

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

您所做的只是将@position 替换为obj。现在获取上面的代码,并将其作为“_error_messages.html.erb”放在您的共享文件夹中

现在,对于需要错误消息的每个文件,您可以渲染部分文件并将 obj 替换为该文件中使用的任何实例变量。(此时,您可以将文件中的任何错误消息代码替换为以下代码,具体取决于您使用的实例变量。下面的示例)在以下位置:

<%= render 'shared/error_messages', obj: @position %>

在用户中:

<%= render 'shared/error_messages', obj: @user %>

在客户端:

<%= render 'shared/error_messages', obj: @client %>

等等... obj: @client #or 任何实例变量切换出部分的“obj”并将实例变量放入它的位置。希望有帮助!

于 2014-03-03T21:27:57.413 回答