2014-02-28 28 views
3

在我的Rails应用程序。我想写一个帮手auto_links在评论中提及"@someusername",并链接到user_path("@someusername")用户标记自动链接 - 导轨

我该怎么做?

我可以自定义auto_link帮手吗?

回答

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

但谁会调用这个方法? 'auto_link'专门调用'auto_link_email_addresses'等方法,所以你不能只添加另一个方法并完成它。 – Matt

+0

这只是将@someusername替换为评论正文中的/ users/@ someusername,并链接到同一页面而不是用户页面 –

+0

感谢Ismael! :)) –

1

看着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语句,因为它看起来像级联方法调用以确定优先级。

这有点严重,但可行。

+0

谢谢马特! :)伊斯梅尔的帮手完美地工作 –

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