Rails部分控制结构

时间:2013-10-23 13:09:15

标签: ruby-on-rails ruby

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

- 但这感觉很糟糕。在某个地方是否有一个控制器我应该为共享的部分设置这种逻辑?

3 个答案:

答案 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