我需要你的帮助。 我有一个小型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类的实例,对于其他内容错误,路线无法修改。
你能帮助我吗?
答案 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