代码之家  ›  专栏  ›  技术社区  ›  Katie H

用户标记自动链接-Rails

  •  3
  • Katie H  · 技术社区  · 11 年前

    在我的rails应用程序中。我想写一个助手 auto_links 提到 "@someusername" 在评论和链接中 user_path("@someusername") .

    我该怎么做?

    我可以自定义 auto_link 帮手

    3 回复  |  直到 11 年前
        1
  •  5
  •   Katie H    11 年前

    这似乎很容易做到。

    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
    
        2
  •  2
  •   JesWang    11 年前

    这一个效果更好,\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
    
        3
  •  1
  •   Matt    11 年前

    查看 gem in which auto_link has been extracted from Rails 3.1+ ,他们似乎不认为auto_link是可扩展的。 Line 64 显示了一个case语句,其中它们调用特定于每种类型的自动链接的方法,因此如果您希望获取新方法,则必须在此处添加新方法。

    如果我是你,我会从Github分叉这个gem并修改它的源代码。这假设您使用的是Rails3.1+。您甚至可以向gem维护人员提交一个pull请求,看看他们是否想要添加此功能。

    如果你不使用gem或者不想分叉git repo,我想我会这样做:我会创建自己的助手,名为 ReferenceAutolink 或类似的,使其扩展 ActionView::Helpers::TextHelper ,并将其放置在应用程序的助手中,就像放置在其他助手中一样。我很确定,当您调用 helper_method ,所以我只需将现有的自动链接代码复制并粘贴到这个助手中,然后在case语句中添加另一个方法来委托,该方法处理引用链接。您必须重写整个case语句,因为它们似乎级联了方法调用以确定优先级。

    这有点恶心,但可行。