用户标记自动链接 - Rails

时间:2014-02-28 23:26:51

标签: ruby-on-rails ruby regex ruby-on-rails-4

在我的rails应用中。我正在尝试撰写帮助auto_links在评论中提及"@someusername"并链接到user_path("@someusername")

我该怎么做?

我可以自定义auto_link帮助程序吗?

3 个答案:

答案 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语句,因为它似乎是级联方法调用以确定优先级。

这有点粗糙,但可行。