gpt4 book ai didi

ruby-on-rails - 高级 Rails 模式 : organizing views around nested doc, 章节,页面层次结构

转载 作者:行者123 更新时间:2023-12-04 18:11:41 25 4
gpt4 key购买 nike

什么是 rails 方式显示嵌套层次结构的 View ?似乎是一个简单的问题,但试着忍受我,也许有人会理解(并希望能消除)我的困惑。

我的应用程序是一个简单的层次结构(为了讨论的目的而更加简化):

  • 在顶部我有一个 文件索引
  • 单击一个并查看有关 的更多详细信息文件 包括 其章节列表(索引)
  • 单击该列表中的章节并获取 一个页面 带有上一个和下一个链接和类似的章节列表在当前突出显示的页边距中。

  • 很简单,但我的问题是 Rails 的方式是什么:
  • 嵌套资源,这样它们就不会太深?
  • 构建 View ?

  • 我问一些看似如此基本的问题的原因是,从第一次单击开始,我正在查看“文档”( document#show )以及其中包含的章节( chapters#index )。那么, View 应该建立在两者中的哪一个?

    与我正在查看章节开头的下一次单击相同。那可能是 chapters#showpages#index行动。不过,可以想象,我猜它可以(也许应该)也由 pages#show 处理。 .

    想法?我是不是想太多了? (可能)

    最佳答案

    路线

    您可以像这样设置路线以利用 Rails 的内置嵌套资源:

    resources :documents, :only => [:index, :show] do
    resources :chapters, :only => :show do
    resources :pages, :only => :show
    end
    end

    这大致相当于设置这些自定义路由:
    get '/documents' => 'documents#index',
    :as => 'documents'
    get '/documents/:id' => 'documents#show',
    :as => 'document'
    get '/documents/:document_id/chapters/:id' => 'chapters#show',
    :as => 'document_chapter'
    get '/documents/:document_id/chapters/:chapter_id/pages/:id' => 'pages#show',
    :as => 'document_chapter_page'

    如果 URL 比您希望的更长更麻烦,或者您想使用自定义参数(例如,通过编号而不是 ID 识别页面),您始终可以编写自定义路由:
    resources :documents, :only => [:index, :show]
    get '/documents/:document_id/:id' => 'chapters#show',
    :as => 'document_chapter'
    get '/documents/:document_id/:chapter_id/:page' => 'pages#show',
    :as => 'document_chapter_page'

    routing guide了解更多信息。

    Controller

    您不希望用户能够直接访问章节,而是应该看到该章节的第一页。但是,可以说章节 URL 在没有页码的情况下工作是有用的(尤其是当页码指的是文档中的位置而不是章节中的位置时)。

    因此,您可以从章节 Controller 的 show 重定向。第一页的 Action :
    class ChaptersController < ApplicationController
    def show
    chapter = Chapter.find(params[:id])
    redirect_to [chapter.document, chapter, chapter.pages.first]
    end
    end

    意见

    您可以采用两种方法在不同 View 之间共享章节列表:
  • 使用 Rails 的内置支持来渲染模型对象的集合。在您的 views/documents/show.html.erbviews/chapters/show.html.erb您可以包括以下内容(我假设每个操作都设置了一个 @document 变量):
    <ol>
    <%= render @document.chapters %>
    </ol>

    Rails 将寻找一个名为 views/chapters/_chapter.html.erb 的局部 View 。 ,并为每一章渲染它。它可能看起来像这样:
    <li><%= link_to chapter, [chapter.document, chapter] %></li>
  • 在一个部分中共享整个列表。例如,您可以将以下内容添加到 views/documents/show.html.erbviews/chapters/show.html.erb :
    <%= render 'chapters/list', :chapters => @document.chapters %>

    并创建一个名为 views/chapters/_list.html.erb 的局部 View :
    <ol>
    <% chapters.each do |chapter| %>
    <li><%= link_to chapter, [chapter.document, chapter] %></li>
    <% end %>
    </ol>

  • 请参阅有关 Using Partials in the Layouts and Rendering guide 的部分了解更多信息。

    关于ruby-on-rails - 高级 Rails 模式 : organizing views around nested doc, 章节,页面层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519722/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com