我正在使用Michael Hartl的书中的示例应用程序构建一个Rails应用程序。为了在用户注册时显示错误消息,我在共享目录中使用了部分 - app / views / shared / _error_messages.html.erb:
<%if @fact %>
<% @data = @fact %>
<% elsif @user %>
<% @data = @user %>
<% end %>
<% if @data.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(@data.errors.count, "error") %>.
</div>
<ul>
<% @data.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
最初,这部分内容刚刚开始:
<% if @user.errors.any? %>
但是,由于我决定重新使用这个部分来显示其他页面上的错误,我必须使用不同的对象(@ user,@fact),具体取决于我在哪个页面上使用它。通过在顶部添加IF语句
可以轻松解决这个问题<%if @fact %>
<% @data = @fact %>
<% elsif @user %>
<% @data = @user %>
<% end %>
- 但这感觉很糟糕。在某个地方是否有一个控制器我应该为共享的部分设置这种逻辑?
答案 0 :(得分:3)
您可以将局部变量传递给partial:
<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
在您的模板中,例如:
<%= render 'shared/error_messages', object: @user %>
答案 1 :(得分:0)
马雷克的回答可能是最好的。但是,这里有一个替代方案,虽然不具备可扩展性,但更接近你所做的。
只需替换:
<%if @fact %>
<% @data = @fact %>
<% elsif @user %>
<% @data = @user %>
<% end %>
使用:
<% @data = @fact||@user %>
答案 2 :(得分:-1)
您可以使用render指向控制器中用于用户和事实的部分。查看API documentation on rendering partials。