【问题标题】:New to RoR, confused about where to put markupRoR 新手,对在哪里放置标记感到困惑
【发布时间】:2011-12-04 17:47:16
【问题描述】:

我对 RoR 很陌生,从 PHP 迁移过来。我希望是一个简单的问题。

假设我有一个名为 Article 的模型,存储在 articles 表中。

如果我想在我的网站的多个页面上显示文章列表,我可能会使用一些简单的标记,例如:

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

我应该把这个标记放在哪里?我的意思是在哪个文件中;如果我把它放在一个视图中,那么如果我想在网站的不同部分有一个类似的列表,我就必须复制它。

把它放在模型本身对我来说似乎很直观,文章对象应该知道如何呈现自己,对吧?但这似乎完全违背了 CMV 的想法。

如果我想有几种方法来渲染同一个对象怎么办?像列表视图、整页视图等。

非常感谢,只是想从一开始就养成正确的习惯。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以将那部分 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的View:

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

    如果 &lt;div class="..."&gt; 在每次使用该局部时都相同,您可以将 :template 传递给局部,或将其放入视图助手中,或将整个渲染与 @987654329 @ 视图助手中的参数。 (这里的第一种或最后一种方法都是我要做的——&lt;div class="..."&gt; 似乎不需要它自己的文件那么重要,但如果它更复杂,它可能——然后我不想在每次需要时都给出部分 :layout 参数。)

    【讨论】:

    • 很好的答案 - 但您应该考虑将部分放在您的视图文件夹内的共享文件夹中,然后使用“/shared/article_list”作为渲染部分的路径。还可以考虑使用 before 过滤器来获取文章列表,您可以更多地使用缓存数据集来提高性能
    • 感谢 sarnold,这让我明白了很多。并打开了一扇新的门——还有更多的阅读要做。
    • @jamesw:两者都是很好的建议——但我犹豫了,因为 lynks 确实说他在学习。 Fragment caching 对于负载下的合理性能绝对重要,但这可能不是问题。如果在多个控制器中使用部分共享文件夹提示绝对是明智的,但同样——这里的简单假设。 :) 不过,感谢您提到它们—— cmets 可以很好地用作脚注。 (请不要犹豫,写下你自己的答案;这个建议值得 +1。:)
    • @lynks:您可能希望稍等片刻,然后再选择我的答案作为已接受的答案。这标志着问题“得到了回答”,并且可能会减少来自其他堆垛机的未来好建议。还不如等一两天。 :)
    【解决方案2】:

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

    因此,您显示的包含一堆 HTML 的标记会进入视图。
    那是app/models/views/article.rb

    控制器是获取信息的部分。

    您实际上应该在控制器中使用@article = Article.all,然后在视图中使用@article.each 而不是Article.find_each

    如果您有条件,您可以直接在 Controller 查找中应用它们,但更好的方法是了解如何将模型查找器与范围一起使用,然后从控制器中使用这些范围。始终尝试将内容从 View 推到 Controller 再到 View,并在可行时遵循“胖模型,瘦控制器”的方法。

    为了重用 partials 会有所帮助,但更好地理解 rails 会有所帮助。

    请参阅 Ryan Bates 的 railscasts。令人难以置信的教程。

    您可能还喜欢我自己的 (rails) linker 应用中的 rails 书签。

    【讨论】:

      【解决方案3】:

      您可以为此使用partials

      【讨论】:

        猜你喜欢
        • 2015-07-29
        • 1970-01-01
        • 2011-06-01
        • 2021-01-13
        • 2011-01-24
        • 1970-01-01
        • 2012-11-24
        • 2016-10-04
        • 2019-10-14
        相关资源
        最近更新 更多