Ruby on rails 在文本属性中插入Rails对象交叉超链接的解决方案(作为HTML)
我正在Rails中的一个web应用程序上工作,它的行为很像CMS:有些文章具有文本属性,其中包含指向其他文章(或其他对象类)的链接。我当前将属性存储为HTML 有没有什么好方法可以以相对容易更改的方式对这些链接进行建模,并包含对对象id的引用,而不是绝对url 我想的解决方案之一是使用某种特殊的标记,例如:Ruby on rails 在文本属性中插入Rails对象交叉超链接的解决方案(作为HTML),ruby-on-rails,ruby-on-rails-3,content-management-system,ckeditor,hyperlink,Ruby On Rails,Ruby On Rails 3,Content Management System,Ckeditor,Hyperlink,我正在Rails中的一个web应用程序上工作,它的行为很像CMS:有些文章具有文本属性,其中包含指向其他文章(或其他对象类)的链接。我当前将属性存储为HTML 有没有什么好方法可以以相对容易更改的方式对这些链接进行建模,并包含对对象id的引用,而不是绝对url 我想的解决方案之一是使用某种特殊的标记,例如: [link_to "Text for the link", Article:12] 其中12是它链接到的文章的id。呈现文本时,将解析此标记 这样做的缺点是,我必须侵入TinyMCE(我想
[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
但可能有一些我现在还没有看到的警告
第二次编辑
我也希望指定我作为内容编辑器,但是如果有更清晰的优点,我会考虑其他的。
一篇文章可以有很多相关文章,同时文章也可以用很多其他文章来说明,所以最好把它建模成一对多关系。has_many :inverse_article_relations, :class_name => "ArticleRelation", :foreign_key => "related_article_id"
has_many :inverse_related_articles, :through => :inverse_article_relations, :source => :article
在Rails中定义这种关系的一种方法是有很多:通过
要使用有很多:通过您必须创建一个连接模型,可以将其称为articlerrelation。此模型将有两个字段,一个是表示当前文章的article_id,另一个是表示被称为related的文章的related_article_id
class Article < AR::Base
has_many :article_relations
has_many :related_articles, :through => :article_relations
end
class ArticleRelation < AR::Base
belongs_to :article
belongs_to :article_relation, :class_name => 'Article'
end
测试它,根据当前的需求,这应该适合您。我使用一个快捷码系统构建了类似的东西,它允许我调用模型上的特定方法并替换文本中的快捷码:
帮手
模型
看法
我没有测试上面的代码,它显然有点简化,但它解释了我在这背后的思考过程
编辑:为了澄清我上面的例子,我使用了一种发明的短码语法[#!method]
我在许多其他CMS中看到的解决方案是TinyMCE中的自定义文件浏览器和页面重写的组合(类似于freakyDaz的答案)
TinyMCE具有实现自定义浏览器的功能。当然,您必须提供后端部件
编辑也有
让您的后端实现返回易于解析的URL(例如,urlfor:Article:12),然后让您的呈现代码用实际URL替换这些URL。我刚刚想到了另一种可能的解决方案:
管理员用户在编辑文本之前指定关系(使用,这可以以用户友好的方式完成)
然后提交表单以保存模型,或者可以异步完成李>
保存关系时,会为每个关系生成并显示一个短代码,短代码可以轻松粘贴到文本中
在前端显示文本时,文本将被解析为短代码,解析方式与本文所建议的类似
这样,我就不必在编辑器中破解或创建自定义操作。我认为这是一个相当务实的方法,但我想听听你的意见。当然,应该教育编写文本的管理员按照该顺序执行流程,但在我的情况下,很少有人可以成为管理员(1或2),因此这是可以管理的。我使用您的第一个解决方案做了类似的事。这与wordpress等系统中的短代码操作方式类似。然后,我构建了一个助手,可以解析可能包含短代码的任何文本,并在模型上调用相关方法。e、 g:parse\u article\u desc(article)
然后我们可以在模型上执行方法,而不仅仅是文本。希望有帮助。我已经有了多对多的关系,所以我知道一篇文章正在链接到n篇其他文章。但是,我想找到一种在编辑器中创建链接的简单方法,这样对创建链接的人来说都很容易,但在代码中也是一种实用的方法。我目前正在使用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) %>