在我的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! :)) –