添加管理多页内容的路由

时间:2015-07-02 11:35:58

标签: ruby-on-rails

我需要你的帮助。 我有一个小型CMS,我的CMS提供文章,新闻和评论。 此刻我有单页内容,但现在我想添加多页面功能。 它看起来很简单,但事实并非如此,现在我将尝试向您展示我如何管理我的内容。

我的内容类

class Content < ActiveRecord::Base
  has_many :elements, class_name: 'ContentElement'
end

我的新闻课

class News < Content
  def main_image_class
    'news'
  end
end

我的评论课

class Review < Content

end

我在创建CMS时选择了这种设计模式,因为我打算添加几种类型的内容和几个布局视图,所以我创建了一个通用内容和一些子类。

正如你所看到的,内容类有很多“ContentElement”:当我设计我的CMS时,我想到了多页面功能,所以我没有在内容中使用“body”,而是使用这个模式生成一个ContentElement:

  create_table "content_elements", force: :cascade do |t|
    t.string   "name"
    t.text     "body"
    t.string   "type"
    t.integer  "content_id"
    t.integer  "position",   default: 0
    t.datetime "created_at"
    t.datetime "updated_at"
    t.text     "meta_body"
  end

内容元素可以是“文本”类型,视频,图像,一切。

与我的内容关联的第一个ContentElement的“正文”是我在视图中呈现的内容的“正文”。单页,当然,因为现在每个内容我只能添加一个ContentElement。

添加多页面功能可能看起来很简单:如果我需要覆盖一些通用方法,我会添加一个类,并为每个内容生成更多ContentElement,第一个ContentElement是第一页,其他是第二页,第三页等。

class MultipageContent < Content

end

我的问题与“路线”有关。 现在我使用这条路线为单页内容生成我的网址:

  match '/magazine/:id/:permalink' => 'contents#show', via: :get, as: :content
  # http://www.example.com/magazine/11856/This-is-my-content

我需要为每个页面内容保留此结构,但我还需要为多页内容调整相同的结构。所以我必须找到一种方法来生成这样的路线:

对于单页内容是相同的:

# http://www.example.com/magazine/11856/This-is-my-content
match '/magazine/:id/:permalink' => 'contents#show', via: :get, as: :content

对于多页内容的第一页是相同的:

# http://www.example.com/magazine/11856/This-is-my-content
match '/magazine/:id/:permalink' => 'contents#show', via: :get, as: :content

对于第二页,多页内容的第三页......我必须获得这样的匹配:

# http://www.example.com/magazine/11856/This-is-my-content-title/this-is-the-second-page

This-is-my-content是“Content”类元素的slugged标题,而this-is-the-second-page是相应ContentElement的slugged名称

我也可以接受这样的东西,一条独特的路线

# http://www.example.com/magazine/11856/This-is-my-content-title/this-is-the-content-element-name

但是使用此路线必须仅适用于MultipageContent类的实例,对于其他内容错误,路线无法修改。

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我认为parantheses应该做到这一点。

match '/magazine/:id/:permalink(/:addl_permalink)' => 'contents#show', via: :get, as: :content

这样,如果您发送addl_permalink,您将获得第二或第三页或第一页。通过铁路路线将Parantheses理解为可选的。

对于每页多页内容,您在db中有记录吗?在这种情况下,您应该在路由中添加该内容以及可读性。喜欢,

match '/magazine/:id/:permalink(/:sub_page_id/:addl_permalink)' => 'contents#show', via: :get, as: :content