2016-12-04 2 views
0

У меня возникли проблемы с трактовкой того, как передаются общие способы передачи данных и становятся доступными для частичных.Rails 5 отрисовка частичных частей и передача данных

Например:

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

static_pages_controller.rb:

def home 
    @feed_items = current_user.feed 
end 

home.html.erb:

<%= render 'shared/feed' %> 

_feed.html.erb:

<%= render @feed_items %> 

Теперь, в моей модели пользователя является метод экземпляра, который достигает в базу данных, чтобы получить ее сообщения:

user.rb:

def feed 
    Micropost.where("user_id = ?", id) 
end 

Так или иначе, потому что Micropost.where(...) возвращает коллекцию microposts заключается в том, как Rails знает, как перейти от _feed.html.erb к другому частичному, где <li> определен для того, как нужно определять микросообщения?

_micropost.html.erb:

<li id="micropost-<%= micropost.id %>"> 
    <%= link_to adorable_avatar_for(micropost.user, size: 50), micropost.user %> 
</li> 

А также это просто конвенция, потому что я на самом деле обработки коллекции microposts, что Rails знает дать переменную micropost?

ответ

2

На ваши вопросы отвечает Ruby on Rails Guides on Layouts and Rendering. Это стоит прочитать информацию о частичных, которая приходит перед цитируемыми пассажами ниже, а также:

Каждых парциальный также имеет локальную переменный с тем же именем, что и частичного (минус подчеркивания). Вы можете передать объект в этой локальных переменный с помощью опция: объект:

<%= render partial: "customer", object: @new_customer %> 

В клиенте частичного, переменная клиент будет относиться к @new_customer от родительского вида. (Ранее руководство указывает, что для указания других параметров для render(), например объекта:, вы должны явно указать partial: и имя частичного.)

Если у вас есть экземпляр модели для рендеринга в частичную вы можете использовать сокращенный синтаксис:

<%= render @customer %> 

Если предположить, что @customer переменная экземпляра содержит экземпляр Образцовый клиент, это будет использовать _customer.html.erb, чтобы сделать его и передаст локальную переменную клиент в части, которая будет , ссылается на переменную экземпляра @customer в родительском представлении.

3.4.5 Рендеринг Коллекции

Частицы очень полезны при рендеринге коллекций. Когда вы передаете коллекцию частично через: вариант сбора, парциальное будет вставляться один раз для каждого элемента в коллекции:

index.html.erb:

<h1>Products</h1> 
<%= render partial: "product", collection: @products %> 

_product.html. ERB:

<p>Product Name: <%= product.name %></p> 

при частичном вызываются с множественной коллекцией, то отдельных случаи частичными имеют доступ к члену коллекции Bei ng, отображаемый через переменную, названную после частичного. В этот случай, частичный _product, а в части _product, , вы можете обратиться к продукту, чтобы получить экземпляр, который визуализируется.

Существует также сокращение от этого. Предполагая, что @products коллекция экземпляров продукта, вы можете просто написать это в index.html.erb для получения того же результата:

<h1>Products</h1> 
<%= render @products %> 

Rails определяет имя частичного использования, глядя на название модели в коллекции. На самом деле, вы можете даже создать гетерогенную коллекцию и сделать это таким образом, и Rails будет выбирать надлежащее парциальное для каждого члена коллекции:

index.html.erb:

<h1>Contacts</h1> 
<%= render [customer1, employee1, customer2, employee2] %> 

клиентов /_customer.html.erb:

<p>Customer: <%= customer.name %></p> 

сотрудников/_employee.html.erb:

<p>Employee: <%= employee.name %></p> 

В этом случае Rails будет использовать частичные данные клиента или сотрудника как , соответствующие каждому члену коллекции.

В случае, если коллекция пуста, рендер будет возвращать нуль, поэтому должно быть довольно просто предоставить альтернативный контент.

<h1>Products</h1> 
<%= render(@products) || "There are no products available." %> 
Смежные вопросы