2016-09-18 4 views
0

У меня есть несколько моделей, что их представления индексов почти разделяют тот же самый код и макет.Как использовать один и тот же вид с несколькими моделями?

.../шоколад/index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @chocolates.each do |chocolate| %> 

    <%= link_to chocolate do %> 
    <%= set_img(chocolate) %> 
    <% end %> 

    <ul> 
    <li><%= chocolate.name %></li> 
    <li><%= chocolate.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to chocolate do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_chocolate_path(chocolate) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to basis, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Chocolate', new_chocolate_path %> 

.../конфеты/index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @sweets.each do |sweet| %> 

    <%= link_to sweet do %> 
    <%= set_img(sweet) %> 
    <% end %> 

    <ul> 
    <li><%= sweet.name %></li> 
    <li><%= sweet.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sweet do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_sweet_path(sweet) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to sweet, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Sweet', new_sweet_path %> 

И есть еще модели, поделитесь одним и тем же макетом. И я подумал, что я продолжаю повторять свое «я», поэтому я создал общий частичный с переменными для рендеринга в каждом представлении, использующем этот макет.

.../конфеты/index.html.erb

<% render 'shared/indexGrid', dist: @sweets%> 

.../просмотров/общий/_indexGrid.html.erb

<% title = dist.class.name.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 
<% sing = dist.class.name.underscore %> 

<h1>Index <% title %></h1> 
<hr> 

<% dist.each do |sing| %> 

    <%= link_to sing do %> 
    <%= set_img(sing) %> 
    <% end %> 

    <ul> 
    <li><%= sing.name %></li> 
    <li><%= sing.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sing do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 

    <%= link_to send("edit_#{sing.class.name.underscore}_path", sing) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 

    <%= link_to sing, class: 'square red', method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 
<% end %> 
<hr> 
<%= link_to "+ Add New #{title}", send("new_#{sing.class.name.underscore}_path"), { class: 'btn btn-success btn-block'} %> 

Но это Ждут» t, похоже, работает, потому что -Я думаю -dist.class.name deasnt возвращает значение, которое я ожидал, но возвращает "active_record/relation". Я пробовал один и тот же подход перед редактированием, и работал с dist: @sweet.

Я думал об использовании макетов, но он оставил меня с большими кусками кода, которые очень похожи на другой индексный вид.

я поделился мои попытки с вами, И вопросы ...

  • Что случилось с моим кодом и как это исправить?
  • Этот подход считается хорошей практикой для СУХОГО кода? и если нет. Каков наилучший способ совместного использования одного и того же кода просмотра с несколькими моделями, когда эти модели почти разделяют тот же самый код и макет?

ответ

1

вы можете попробовать model_name

<% title = dist.model_name.to_s.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 

или еще нет.

<% title = dist.model_name.human.pluralize.titleize %> 

также должен предоставить вам то, что вы хотите.

и очистить маршруты, вы можете посмотреть на PolymorphicRoutes

http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

поэтому вместо

link_to send("edit_#{sing.class.name.underscore}_path", sing) 

вы можете использовать что-то вроде

link_to 'Edit, edit_polymorphic_path(sing) 

Это должно очистить поделитесь своей общей индексной страницей.

Вы также можете посмотреть создание помощника title_for (например), который возвращает заголовок. для очистки, но не 100% требуется.

- часть 2 -

Является ли это хорошая идея? Может быть? как это для не-ответа. Есть много факторов. Насколько вероятно, что все эти модели всегда будут одинаковыми? Насколько тяжело или много будет работать, чтобы потом сделать другое? Если бы у меня была куча моделей, в которых все в основном одинаковые, всегда были бы одинаковые точные индексные страницы, я бы, наверное, посмотрел на то, что делал что-то похожее на это. Такая же идея используется с двигателями/драгоценными камнями/плагинами, которые автоматически генерируют виды и т. Д. Поэтому я предполагаю, что если они всегда будут одинаковыми, и вы всегда хотели бы, чтобы все выглядело одинаково, что-то вроде этого отлично.

Что касается коллекций в партитурах, когда вы смотрите на что-то вроде @sweets, это не один экземпляр вашей модели. Это, вероятно, ActiveRelation. поэтому звонок model_name от active_model не поможет. Если вы посмотрите на направляющие рельсов по частичным, вы увидите render @collection. Это в основном просто итерации каждого объекта в коллекции, смотрит на имя model_name для вас и передает его соответствующему частичному рендерингу.

Итак, если у вас есть коллекция @sweets, в которой есть объекты из Sweet, рельсы будут перебирать коллекцию. а затем отрисуйте _sweet.html.erb (следуя нормальным правилам определения того, какие частичные), для вас. С этим вы можете отрегулировать свой блок <% dist.each do |sing| %>, чтобы быть <%=render dist%>, а затем просто убедитесь, что у каждой модели есть частичная, и это может сделать их по-разному

+0

Спасибо человеку за отличный ответ, сейчас он отлично работает, Но вторая часть моей вопрос по-прежнему не ответил, так вы думаете, что это лучший подход к такому делу? Считаете ли вы, что это правильно, чтобы делиться мнениями между моделями - правильное или разумное. Я смотрел документацию «Partial», и я нашел что-то под названием «коллекция». Я сомневался, что это имеет какое-то отношение к таким случаям. Также, когда я запускал '@ sweets.model_name', он возвращал хеш с большим количеством значений, таких как именованные маршруты и другие переменные экземпляров, я также сомневался, что это может помочь. –

+0

добавил дополнительную информацию, которая, надеюсь, поможет ... – Doon

+0

Спасибо за вашего мужчину, последний абзац был очень полезен –

0

Простое решение заключается в использовании партиалы включая class_name в качестве параметра

<% render 'shared/indexGrid', dist: @sweets, class_name = "Sweets"%> 

Или добавить что-то позволяет распознать, который является источником ....

Смежные вопросы