2014-02-28 66 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