Rails использует один и тот же партиал при рендеринге массива объектов STI

Мое приложение реализует наследование одной таблицы для решения логики различных типов пользователей: Admin, Client, Agent с аналогичными функциями. Все они записаны в User таблицу.

При рендеринге страницы users#index я хотел бы, чтобы все они использовали один и тот же партиал, поскольку я в основном рендерю одно и то же.

#app/controllers/users_controller.rb
def index
  @users=User.all
end
<!-- app/views/users/index.html.erb -->
<div class="row">
    <h2>
        Users
    </h2>
</div>
<div class="row">
    <table class="table table-striped">
        <thead>
            <tr>
                <th>User type</th>
                <th>Id</th>
                <th>Username</th>
            </tr>
        </thead>
        <tbody>
            <%=  render @users, as: :user, partial: 'users/user' %>
        </tbody>
    </table>
</div>
<!-- app/views/users/_user.html.erb -->
<tr>
    <th><%= user.class.name %></th>
    <th><%= user.id.to_s %></th>
    <th><%= user.username%></th>
</tr>

Всякий раз, когда я пытаюсь перейти на страницу индекса, я получаю сообщение об ошибке типа Missing partial admins/admin.

Я думал, что строка <%= render @users, as: :user, partial: 'users/user' %> подойдет, но это не так!


person lllllll    schedule 12.03.2014    source источник
comment
Вы пробовали установить явную опцию сбора? <%= render partial: "users/user", collection: @users, as: :user %>   -  person j-dexx    schedule 12.03.2014
comment
вау, если сделать это явным, это действительно исправит. Я даже не думал об этом варианте. Дайте ответ, и я приму его, спасибо.   -  person lllllll    schedule 12.03.2014


Ответы (2)


<%= render partial: "users/user", collection: @users, as: :user %>

Попробуйте передать явную опцию сбора.

person j-dexx    schedule 12.03.2014
comment
Есть ли противоположный способ визуализации различных пользовательских партиалов? ‹% = Render partial: info, collection: @users, as:: user%› и получить partials users / _admin_info, users / _client_info и т. Д. - person Molfar; 17.03.2019

Вместо этого вы можете сделать следующее:

 <tbody>
   <% @users.each do |user| %>
     <%= render :partial => 'users/user', :locals => {:user => user} %>
   <% end %>
 </tbody>
person Slicedpan    schedule 12.03.2014
comment
Хорошая точка зрения. Хотя я думаю, что буду придерживаться синтаксиса, который у меня уже есть, и сделаю collection: @users явным, как предложил @Baloo. - person lllllll; 12.03.2014