RoR的新手,对于放置标记的位置感到困惑

时间:2011-12-04 09:07:37

标签: ruby-on-rails

我对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 个答案:

答案 0 :(得分:4)

您可以将HTML标记的这一部分放入所谓的partial - 可以呈现为较大布局的一小部分。你是对的,你不希望在模型中存储格式,因为你可能希望为Web浏览器呈现特定的HTML,并为使用API​​的客户端呈现非常相似的XML或JSON,并将其他一些非常相似的内容渲染到ASN.1或YAML用于其他客户。 “观点”确实应该与观点保持联系。

通过这个具体的例子,您可能会更进一步,通过变量提供文章来呈现,而不是让视图找到文章本身:

控制器:

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

查看:

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

然后为名称为_article_list的相应控制器提供视图:

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

如果<div class="...">在每次使用此部分时都相同,您可以将:template传递给部分,或者将其放入视图助手,或者放置整个渲染在视图助手中使用:template参数。 (这里的第一个或最后一个方法就是我要做的事情 - <div class="...">似乎不需要自己的文件,但如果它更复杂,它可能 - 然后我不想在每次需要时给出部分:layout参数。)

答案 1 :(得分:1)

MVC (模型 - 视图 - 控制器):
该模型(主要)具有数据库片段和业务逻辑 控制器控制应用程序流程 视图显示信息,例如浏览器视图。

因此,您显示的包含HTML的标记会出现在视图中 那是app/models/views/article.rb

Controller是获取信息的部分。

您实际上应该在控制器中拥有@article = Article.all,然后在视图中使用@article.each代替Article.find_each

如果您有条件,可以直接在Controller上找到它们,但更好的方法是了解如何使用带范围的模型查找器,然后使用控制器中的那些范围。总是尝试从View到Controller向上查看并在实际操作时遵循'胖模型,瘦控制器'的方法。

对于重用部分可以提供帮助,但是更好地了解rails会有所帮助。

见Ryan Bates的railscasts。令人难以置信的教程。

您可能也想在我的(rails)linker应用中使用我自己的rails书签。

答案 2 :(得分:0)

您可以使用partials