我正在Rails的Web应用程序中工作,其行为非常类似于CMS:有些文章具有其text属性,该属性包含指向其他文章(或其他对象类)的链接。我当前将属性存储为HTML。
有没有什么好方法可以以相对容易更改的方式对这些链接进行建模,并包含对对象ID的引用,而不是绝对URL?
其中一个解决方案我当时在想使用某种特殊的标记,例如:
[link_to "Text for the link", Article:12]
其中12是它链接到的文章的ID。呈现文本时,将解析此标记。
缺点是我必须侵入TinyMCE(我正在考虑用来编辑HTML的编辑器),以便它可以通过访问数据库并自动分配对象类型和ID来插入指向其他对象的链接。 (编辑文本的人不知道ID)。
对此有任何简单的解决方案吗?
或者我应该坚持使用绝对URL(除了维护问题,它在开发中很烦人,因为它们总是指向生产环境,这对我来说很混乱)?
此外,是否有人在其他语言(php,Wordpress,其他CMS等)中有类似的示例,可以很好地解决此问题?我在想,这在CMS中非常重要,如果一个好的系统可以处理所有这些链接,则可以减少很多工时。
编辑:
我正在考虑的另一种可能的解决方案是让人们直接在代码中复制文章的链接,但是提交后,它应该生成正确的关联ID并使其正确,以便在url结构更改时,链接始终是最新的。如果您尝试过这种方法,我想听听您的意见和经验。
这种方法的挑战在于解析与Rails的链接,并发现它指向文章,并且该文章的ID为##
。然后,我必须插入一个短代码,该短代码将始终在解析和渲染后转换为该文章的实际链接。
我发现了一种可以使之可行的方法:
Rails.application.routes.recognize_path
但是可能有些警告我现在看不到...
编辑编号2
我还想指定我选择CKEditor作为内容编辑器,但如果有更明显的优势,我将考虑其他选择。
我已经使用简码系统构建了类似的东西,它将允许我在模型上调用特定方法并替换文本中的简码:
def parse_shortcode(model)
text = model.text
text.gsub(/(\[#!\s?\w+\])/i) do |match|
result = model.try(match)
result.nil? '' : link_to(result[:text], result[:url])
end
end
def contact_link
{ :text => self.name, :url => self.url }
end
<%= parse_shortcode(@article) %>
我还没有测试上面的代码,显然已经简化了一些,但是它解释了我背后的思考过程。
编辑:只是为了澄清我的上述示例,使用了发明的[#! method]
的短代码语法>
一篇文章可以包含许多相关文章,同时这篇文章可以与许多其他文章相关,因此最好将此模型建模为多对多关系。