Новичок в RoR, смущен тем, где поставить разметку - PullRequest
1 голос
/ 04 декабря 2011

Я очень новичок в RoR, переходя с PHP. У меня есть то, что я надеюсь, это простой вопрос.

Допустим, у меня есть модель под названием Артикул , хранящаяся в таблице Артикулы .

Если я хочу отобразить список статей на нескольких страницах моего сайта, у меня может быть некоторая простая разметка, например;

<% Article.find_each do |article| %>
    <div class="article_list_wrapper">
        <h1><%= article.title %></h1>
        <p><%= article.body %></p>
    </div>
<% end %>

Куда бы я положил эту разметку? Я имею ввиду в каком файле; если я помещу это в представление, то мне придется скопировать его, если я хочу подобный список в другой части сайта.

Поместить его в саму модель мне кажется интуитивно понятным, объект Article должен знать, как визуализировать себя, верно? Но это, кажется, полностью противоречит идее CMV.

А что, если бы я хотел иметь несколько способов рендеринга одного и того же объекта? Например, просмотр списка, просмотр всей страницы и т. Д.

Большое спасибо, просто с самого начала пытаюсь освоить правильные привычки.

Ответы [ 3 ]

4 голосов
/ 04 декабря 2011

Вы бы поместили эту часть HTML-разметки в так называемую частичную - что-то, что может быть визуализировано как маленький фрагмент большего макета. Вы правы, вам не захочется хранить формат в модели, потому что вы, возможно, захотите визуализировать этот конкретный HTML-код для веб-браузеров, а также очень похожий XML или JSON для клиентов, использующих API, и визуализировать некоторый другой очень похожий контент в ASN.1 или YAML для других клиентов. «Вид» действительно должен оставаться связанным с представлениями.

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

Контроллер:

def flubber:
    @articles = Article.find_each(some_criteria)
end

Вид:

<div class="article_list_wrapper">
    <%= render :partial => "article_list", :collection => @articles %>
</div>

И затем предоставьте View для соответствующего контроллера с именем _article_list:

    <h1><%= article.title %></h1>
    <p><%= article.body %></p>

Если <div class="..."> будет идентичным при каждом использовании этого партиала, вы можете передать :template в партиал, или поместить его в помощник вида, или поместить весь рендер с :template аргумент в представлении помощника. (Либо первый, либо последний подход здесь - это то, что я бы сделал - <div class="..."> не кажется настолько важным, чтобы требовать собственный файл , но если бы он был более сложным, он мог бы - и тогда я не хотел бы давать частичный аргумент :layout каждый раз, когда мне это нужно.)

1 голос
/ 04 декабря 2011

MVC (модель-представление-контроллер):
Модель имеет (прежде всего) часть базы данных и бизнес-логику.
Контроллер контролирует поток приложений.
Вид показывает информацию, например, вид браузера.

Таким образом, отображаемая вами разметка, содержащая связку HTML, отображается в виде.
То есть app/models/views/article.rb

Контроллер - это та часть, которая получает информацию.

На самом деле вы должны иметь @article = Article.all в вашем контроллере, а затем просто использовать @article.each вместо Article.find_each в вашем представлении.

Если у вас есть условия, вы можете применить их непосредственно к поиску контроллера, но лучший способ - узнать, как вы можете использовать искатели моделей с областями, а затем использовать эти области из контроллера. Всегда старайтесь переходить от View к Controller к View и придерживаться подхода «толстая модель, тонкий контроллер», когда это возможно.

Для повторного использования партиалы могут помочь, но лучше поможет понимание рельсов.

См. railscasts Райана Бейтса. Невероятные учебники.

Вам также могут понравиться мои собственные закладки для rails в моем приложении (rails) linker .

0 голосов
/ 04 декабря 2011

Для этого вы можете использовать partials .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...