Rails: рендеринг моделей?

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

<%=@thing -%>

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

[Заранее спасибо, weppos, за исправление тегов в этом вопросе :)]


person Dan Rosenstark    schedule 11.08.2009    source источник


Ответы (3)


Если вы передадите модель напрямую в рендеринг, он попытается частично визуализировать для этого.

<%= render @thing %>

Это то же самое, что.

<%= render :partial => 'things/thing', :object => @thing %>

Если вы передаете массив моделей...

<%= render @things %>

Он будет отображать партиал _thing для каждого, как если бы вы сделали это.

<%= render :partial => 'things/thing', :collection => @things %>

Примечание: для этого требуется Rails 2.3. Если у вас есть более ранние версии Rails, вам нужно будет использовать параметр :partial, чтобы сделать то же самое.

<%= render :partial => @thing %>
person ryanb    schedule 11.08.2009

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

Кроме того, to_s действительно предназначен для возврата короткого строкового представления вашей модели, полезного для целей отладки и т. д.

person John Topley    schedule 11.08.2009
comment
Точно. Я добавлял .to_html в модель, но это СОВЕРШЕННО неправильное место для кода представления. Который вы упоминаете. В любом случае, спасибо. - person Dan Rosenstark; 11.08.2009

Вы ведь не из Seaside? :) (Я спрашиваю, потому что именно так все и работает там, где каждая модель/визуализируемый объект знает, как отрисовывать себя, и именно так вы выкладываете страницу.)

Что касается вашего фактического вопроса, стандартный способ сделать это - отобразить частичное, которому вы передаете свой @thing. (т. е. вы правы насчет партиалов, и именно так представления обычно ассоциируются с моделями.)

person Edward Ocampo-Gooding    schedule 11.08.2009
comment
Нет, Seaside для меня — это просто место на короткой майке. en.wikipedia.org/wiki/Seaside_Heights,_New_Jersey - person Dan Rosenstark; 11.08.2009
comment
Тем не менее, такой образ мышления очень похож на объектно-ориентированный, и это типично для smalltalk. - person Dan Rosenstark; 11.08.2009