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

Я только начал использовать Partials в своем приложении rails, на данный момент у меня есть следующий код в моем application.html.erb

<%= render 'categories/categorieslist' %>

Это ссылается на _categorieslist.html.erb в моих представлениях / категориях / папке

На данный момент этот партиал содержит жестко закодированные гиперссылки

<ul class="unstyled">
    <li style="padding-bottom:5px"><a href="#">Item A&raquo;</a></li>
    <li style="padding-bottom:5px"><a href="#">Item B&raquo;</a></li>
</ul>

Моя цель - получить эти категории из базы данных, например

<ul class="unstyled">
    <% @categories.each do |category| %>
        <li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo;    </a></li>
    <% end %>
</ul>

Я попытался добавить метод списка категорий в контроллер категорий, например

def categorieslist
 @categories = Category.all
  respond_to do |format|
     format.html # index.html.erb
     format.json { render json: @categories }
   end
  end

но это не вызывается партиалом (и я не думаю, что это даже правильный способ сделать это) и показывает ошибку

NoMethodError in Store#index

в строке ‹% @ category.each do | category | %>

У меня вопрос: как передать в партиал в файле application.html.erb объект категорий, который обычно поступает из метода контроллера в контроллере категорий?

Любая помощь была бы замечательной.


person norbert    schedule 08.01.2012    source источник


Ответы (3)


Вы можете отправить locales с вашим частичным вызовом в вашем представлении и передать переменные в этот частичный.

Например (это частичный ярлык):

Ваш взгляд, из которого вы называете частичное

<%= render 'categories/categorieslist', :all_categories => @categories %>

Ваши частичные категории / _categorieslist.html.erb (обратите внимание, что с переменной нет @)

<ul class="unstyled">
  <% all_categories.each do |category| %>
    <li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo;    </a></li>
  <% end %>
</ul>

Для получения дополнительной информации (и полной версии) см. 3.4.4 Передача локальных переменных в руководствах по Rails.

person Tim Brandes    schedule 08.01.2012
comment
Спасибо, я не совсем уверен в том, как организовать код так, чтобы коллекция @ категорий, переданная в этот партиал, заполнялась вызовом @ Categories = Category.all, где этот запрос activerecord должен быть упорядочен в коде, если партиал находится в файле макета application.html.erb? - person norbert; 10.01.2012
comment
Если он находится в application.html.erb, он должен войти в ваш ApplicationController. Здесь вы можете создать before_filter и такой метод, как def get_cats @categories = Category.all end, или вы можете напрямую вызвать метод (он возвращает последнее значение в методе) с помощью <%= render 'categories/categorieslist', :all_categories => get_cats %> - person Tim Brandes; 10.01.2012
comment
Прекрасно, я не был уверен, можно ли включить такие вещи в ApplicationController, и не нашел четких примеров, спасибо! - person norbert; 10.01.2012

Я бы использовал для этого коллекцию:

<%= render 'categories/categorieslist', :collection => @categories, :as => :category %>

Это отображает коллекцию элементов. В данном случае все категории. Вы также можете передать ему собственное имя с помощью: as =>.

Затем в свой партиал вы включаете только то, что вы хотите, чтобы элементы коллекции отображали:

<li style="padding-bottom:5px"><a href="#"><%= category.name %> &raquo; </a></li>

-Ul- не включен, так как он будет отображаться несколько раз. Вам нужно будет обернуть его вокруг тега рендеринга.

Результат такой же, как и в предложении @timbrandes (ознакомьтесь с документами, на которые он ссылается).

Я слышал: коллекция дает вам улучшения производительности. http://rails-bestpractices.com/posts/38-use-render-collection-rails-3-when-possible

person Galaxy    schedule 08.01.2012

Это неправильный способ сделать это, и ваш вопрос довольно сбивает с толку.

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

В любом случае, методы контроллера обычно представляют собой HTTP-запросы. И они вызываются в соответствии с тем, что определено в файле config / routes. Представления (* .erb) обычно не вызывают методы контроллера. Если они это сделают, они сделают это через запрос ajax.

Данные передаются от действий к представлениям через переменные экземпляра контроллеров.

Если вы хотите вызывать какие-либо методы в представлениях, они должны быть определены в помощниках. Тем не менее, единственные данные, которыми они будут манипулировать, - это данные, передаваемые контроллерами как переменные экземпляра.

person Pedro Rolo    schedule 09.01.2012