【问题标题】:Control Structure in Rails PartialRails 部分中的控制结构
【发布时间】:2025-11-30 13:30:01
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

    <% 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 %>
    

    【讨论】:

    • 不错!奇迹般有效。谢谢马雷克!
    【解决方案2】:

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

    只需替换:

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

    与:

    <% @data = @fact||@user %>
    

    【讨论】:

      【解决方案3】:

      您可以使用 render 来指向控制器中的用户和事实的部分。查看API documentation on rendering partials

      【讨论】: