[英]Prevent race-conditions in slug generation with friendly-id and rails
[英]How to make case sensitive URLs with Rails / Friendly-Id?
我正在使用Friendly-Id
gem
來創建漂亮的URL。 我想創建區分大小寫的URL,並將同一URL的所有其他大小寫版本重定向到狀態為301
的默認URL。
/profile/Jack-Wild # default URL
/profile/jack-wild # redirect to /profile/Jack-Wild
/profile/jaCk-Wild # redirect to /profile/Jack-Wild
Friendly_Id
小寫字母,並且僅匹配並接受小寫字母網址,其他為404
。
slug_case_sensitive
解決方案是維護slug_case_sensitive
(Jack-Wild)以及slug
的默認小寫版本(jack-wild)。
然后使Friendly_Id
由搜索slug
柱,用params[:id].downcase
並且如果params[:id] != slug_case_sensitive
重定向到優選URL( /profile/slug_case_sensitive
)。
這是我關於如何實現的想法,缺少一些難題,希望有人可以幫助他們解決。
修改create和update slug方法,以創建和更新兩個版本的slug。 這只會是一種方法: set_slug
:
# Sets the slug.
def set_slug(normalized_slug = nil)
if should_generate_new_friendly_id?
candidates = FriendlyId::Candidates.new(self, normalized_slug || send(friendly_id_config.base))
slug = slug_generator.generate(candidates) || resolve_friendly_id_conflict(candidates)
send "#{friendly_id_config.slug_column}=", slug
end
end
private :set_slug
假設子彈未壓縮。 應該更改: send "#{friendly_id_config.slug_column}=", slug
使用: send "#{friendly_id_config.slug_column}=", slug.downcase
send "#{friendly_id_config.slug_column_case_sensitive}=", slug
是否足夠? 另外,如何添加和設置friendly_id_config.slug_column_case_sensitive
選項?
然后,將user_path(@user)
和<%= link_to "My profile", current_user %>
user_path(@user)
更改<%= link_to "My profile", current_user %>
以返回區分大小寫的URL。 但是沒有比user_path(id:@user.slug_case_sensitive)
更好的方法了,這很難看,而且我將不得不在各處進行更改,並且不確定是否可以在第三方寶石中完成...
關於此的任何想法將有所幫助,將不勝感激。 謝謝!
也許在這種情況下可以采用不同的方法:最有可能的是,您將在Nginx后面使用Rails應用程序作為代理。 然后,可以將所有帶有大寫字母的配置文件請求重寫為規范變體。 它比發出其他數據庫請求和使用整個Rails堆棧要快。 而且它可能更容易實現。
您可以在模型中覆蓋方法normalize_friendly_id
:
def normalize_friendly_id(value)
value.to_s.parameterize(preserve_case: true)
end
它依靠的ActiveSupport參數化它接受一個preserve_case
選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.