在我的rails应用中。我正在尝试撰写帮助auto_links
在评论中提及"@someusername"
并链接到user_path("@someusername")
。
我该怎么做?
我可以自定义auto_link
帮助程序吗?
答案 0 :(得分:5)
这似乎很容易做到。
def auto_link_usernames(text)
text.gsub /@(\w+)/ do |username|
link_to(username, user_username_path(username.gstub('@', '')))
end.html_safe
end
您需要添加新的路由和控制器操作,以便您可以拥有用户名如/user/:username
在您的控制器中,您可以
def username_show
@user = User.where(username: params[:username]).first
render 'show'
end
编辑:
实际上这很有效:
def auto_link_usernames(text)
text.gsub /@(\w+)/ do |username|
link_to(username, user_path(username.gsub('@', '')))
end.html_safe
end
答案 1 :(得分:2)
这个更好用,\ b是单词分词检测,所以句子可能只是@username而没有别的,它仍然可以工作(空格,也被认为是分词)。
def auto_link_usernames(text)
text.gsub /(?<=\s|^)@[A-Za-z0-9_]+(?=\b)/ do |username|
link_to(username, user_path(username.gsub('@', '')))
end.html_safe
end
答案 2 :(得分:1)
查看gem in which auto_link has been extracted from Rails 3.1+,看起来他们并不认为auto_link是可扩展的。 Line 64显示了一个案例陈述,其中他们调用了特定于每种类型的自动链接的方法,因此如果您希望将其添加到此处,则必须在此处添加新方法。
如果我是你,我会从Github分叉这个宝石并修改它的来源。这假设您正在使用Rails 3.1+。您甚至可以向gem维护者提交拉取请求,以查看他们是否要添加此功能。
如果您没有使用gem或者不想分叉git repo,我想我会像这样修补它:我会创建自己的帮助器,称为ReferenceAutolink
或其他一些,使其扩展ActionView::Helpers::TextHelper
,并将其放在应用程序的帮助程序中,就像任何其他帮助程序一样。我很确定应用程序帮助程序可以在调用helper_method
时覆盖现有的帮助程序,因此我只需将现有的自动链接代码复制并粘贴到此帮助程序中,并在case语句中添加另一个委托给的方法你的引用链接。您将不得不重写整个case语句,因为它似乎是级联方法调用以确定优先级。
这有点粗糙,但可行。