在文本属性中插入Rails对象的交叉超链接的解决方案(作为HTML)

Cri*_*ian 5 ruby-on-rails hyperlink content-management-system ckeditor ruby-on-rails-3

我正在使用Rails中的Web应用程序,其行为与CMS非常相似:有些文章,其文本属性包含指向其他文章(或其他对象类)的链接.我目前正在将该属性存储为HTML.

有没有什么好方法可以以相对容易更改的方式对这些链接进行建模,并包含对象id的引用,而不是绝对URL?

我想的其中一个解决方案是使用某种特殊标记,例如:

[link_to "Text for the link", Article:12]
Run Code Online (Sandbox Code Playgroud)

其中12是它链接到的文章的ID.在呈现文本时将解析此标记.

这样做的缺点是我必须入侵TinyMCE(我正在考虑使用编辑HTML的编辑器),以便它可以通过访问数据库并自动分配对象类型和ID来插入到其他对象的链接(编辑文本的人不知道id.).

这有什么简单的解决方案吗?

或者我应该坚持使用绝对网址(除了维护问题,在开发过程中很烦人,因为它们总是指向生产,这对我来说很困惑)?

另外,是否有人在其他语言(php,Wordpress,其他CMS等)中有类似的例子以一种很好的方式解决这个问题?我想,这在CMS中非常重要,如果一个好的系统可以处理所有这些链接,可以减少大量的工时.

编辑:

我正在考虑的另一个可能的解决方案是让人直接在代码中复制文章的链接,但是在提交时它应该生成正确的关联id并使其成为如果url结构改变,链接是总是最新的.如果你已经尝试过,我想听听你对这种方法的看法和经验.

这种方法的挑战是使用Rails解析链接并发现它指向文章,并且该文章具有id ##.然后我必须插入一个短代码,它将在解析和渲染时始终转换为该文章的实际链接.

我发现了一种方法可以使这个可行:

Rails.application.routes.recognize_path
Run Code Online (Sandbox Code Playgroud)

但可能有一些警告我现在还没看到......

编辑没有.2

我还想指定我选择CKEditor作为内容编辑器,但如果有更清晰的优点,我会考虑其他的.

Dar*_*all 2

我使用短代码系统构建了类似的东西,它允许我调用模型上的特定方法并替换文本中的短代码:

帮手

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
Run Code Online (Sandbox Code Playgroud)

模型

def contact_link
  { :text => self.name, :url => self.url }
end
Run Code Online (Sandbox Code Playgroud)

看法

<%= parse_shortcode(@article) %>
Run Code Online (Sandbox Code Playgroud)

我还没有测试上面的代码,它显然有点简化,但它解释了我背后的思维过程。

编辑:只是为了澄清我上面的示例使用了发明的短代码语法[#! method]