在我的Rails应用程序。我想写一个帮手auto_links
在评论中提及"@someusername"
,并链接到user_path("@someusername")
。用户标记自动链接 - 导轨
我该怎么做?
我可以自定义auto_link
帮手吗?
在我的Rails应用程序。我想写一个帮手auto_links
在评论中提及"@someusername"
,并链接到user_path("@someusername")
。用户标记自动链接 - 导轨
我该怎么做?
我可以自定义auto_link
帮手吗?
这似乎很容易做到。
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
看着gem in which auto_link has been extracted from Rails 3.1+,看起来他们并不认为auto_link是可扩展的。 Line 64显示了一个case语句,他们在这里调用每种类型的自动链接特有的方法,所以如果您希望它被拾取,那么您必须在这里添加新的方法。
如果我是你,我会从Github中分享这个宝石并修改它的源代码。这假定你正在使用Rails 3.1+。你甚至可以向gem维护者提交一个pull请求,看看他们是否想要添加这个功能。
如果你不使用宝石或不想分叉git repo,我想我会像这样猴子补丁:我会创建我自己的助手,叫做ReferenceAutolink
或者其他一些,使它扩展ActionView::Helpers::TextHelper
,并将其放置在应用程序的帮助程序中,就像您使用其他帮助程序一样。我非常肯定,当您拨打helper_method
时,应用程序帮助程序可以覆盖现有的帮助程序,因此我只需将现有的自动链接代码复制并粘贴到此帮助程序中,然后添加另一个方法委派给处理您的引用链接的case语句。你必须重写整个case语句,因为它看起来像级联方法调用以确定优先级。
这有点严重,但可行。
谢谢马特! :)伊斯梅尔的帮手完美地工作 –
这个工作更好,\ 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
但谁会调用这个方法? 'auto_link'专门调用'auto_link_email_addresses'等方法,所以你不能只添加另一个方法并完成它。 – Matt
这只是将@someusername替换为评论正文中的/ users/@ someusername,并链接到同一页面而不是用户页面 –
感谢Ismael! :)) –