1

我正在从 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 %>

- 但这感觉很恶心。是否有一个控制器我应该将这种逻辑用于共享部分?

4

3 回答 3

3

您可以将局部变量传递给部分:

<% 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 %>
于 2013-10-23T13:12:20.347 回答
0

Marek 的回答可能是最好的。但是,这是一个替代方案,虽然不可扩展,但更接近您所做的。

只需更换:

<%if @fact %>
  <% @data = @fact %>
<% elsif @user %>
  <% @data = @user %>
<% end %>

和:

<% @data = @fact||@user %>
于 2013-10-23T13:26:35.143 回答
-1

您可以使用 render 来指向用户和事实的控制器的部分。查看有关渲染部分的 API 文档

于 2013-10-23T13:13:53.260 回答