我试图在我的视图中重用错误消息块。
以下是位置/ _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 %>
然后在视图文件中。 positions / new.html.erb我写了下面的代码
<div id="errorbox">
<%= render "shared/error_messages" %>
<%= error_message(@position) %>
</div>
这意味着我现在可以在所有创建和更新操作中使用相同的代码。
答案 0 :(得分:8)
不,在视图中定义方法不是正确的方法。我认为你应该用第一部分中的@position
替换以更通用的方式命名的局部变量,例如object
,并使用以下内容渲染此部分:
<%= render 'shared/error_messages', object: @position %>
将@position
作为局部变量object
传递给局部变量。
答案 1 :(得分:3)
<%= render partial: 'shared/error_messages', locals: {position: @position} %>
现在,在共享文件夹中的部分_error_messages.html.erb
中,您可以使用position
变量。
有关更多帮助,请参阅http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html。
答案 2 :(得分:1)
这不是最好的方法。 在第一个代码块中用@ obj(作为示例)更通用的东西替换@position。所以它看起来像这样。
<% 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 %>
你所做的就是用obj替换@position。 现在使用上面的代码,并将其作为'_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'并将实例变量放入其中。希望有所帮助!