如何使用Rails/Friendly-Id制作区分大小写的URL



我正在使用Friendly-Id gem创建漂亮的URL。我想创建区分大小写的URL,并将同一URL的所有其他大小写版本重定向到具有301状态的默认版本。

/profile/Jack-Wild # default URL
/profile/jack-wild # redirect to /profile/Jack-Wild
/profile/jaCk-Wild # redirect to /profile/Jack-Wild

Friendly_Id下变频器的slugs和仅匹配并接受下变频器URL,404处理其他所有内容。

可行的解决方案是维护slug_case_sensitive(Jack Wild)以及slug的默认下变频版本(Jack Wilde)。

然后用params[:id].downcaseslug列搜索Friendly_Id,如果params[:id] != slug_case_sensitive重定向到首选URL(/profile/slug_case_sensitive)。

这是我关于如何实现它的想法,缺少一些谜题,希望有人能帮助填写。

修改创建和更新段塞方法,以创建和更新两个版本的段塞。这只是一种方法: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.downcasesend "#{friendly_id_config.slug_column_case_sensitive}=", slug够了吗?另外,如何添加和设置friendly_id_config.slug_column_case_sensitive选项?

然后,更改user_path(@user)<%= link_to "My profile", current_user %>以返回区分大小写的URL。但没有比user_path(id:@user.slug_case_sensitive)更好的方法了,它很丑陋,而且我不得不到处改变它,不确定它是否可以在第三方宝石中完成。。。

任何关于这方面的想法都会有所帮助,我们将不胜感激。谢谢

在这种情况下可能会应用不同的方法:很可能您会使用Nginx后面的Rails应用程序作为代理。然后,可以将所有带有大写字母的概要文件请求重写为规范变体。它将比发出额外的DB请求和使用整个Rails堆栈更快。此外,它的实现可能要简单得多。

您可以覆盖模型中的方法normalize_friendly_id

def normalize_friendly_id(value)
  value.to_s.parameterize(preserve_case: true)
end

它依赖于接受preserve_case选项的ActiveSupport参数化。

最新更新