Ruby on rails 如何使用Rails/友好Id创建区分大小写的URL?

Ruby on rails 如何使用Rails/友好Id创建区分大小写的URL?,ruby-on-rails,friendly-url,friendly-id,Ruby On Rails,Friendly Url,Friendly Id,我正在使用友好Idgem创建漂亮的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\u Iddowncase的slug,只匹配并接受downcase的U

我正在使用
友好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\u Id
downcase的slug,只匹配并接受downcase的URL,
404
ing其他所有内容

可行的解决方案是保持
slug\u区分大小写
(Jack Wild)以及
slug
(Jack Wild)的默认下行版本

然后使用
params[:Id]通过
slug
列进行
Friendly_Id
搜索。downcase
和if
params[:Id]!=slug\u区分大小写
重定向到首选URL(
/profile/slug\u区分大小写

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

修改创建和更新slug方法,以创建和更新slug的两个版本。这将是唯一一种方法:
set\u 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
假设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
够了吗?另外,如何添加和设置
友好的\u id\u config.slug\u column\u区分大小写的
选项

然后,更改
user\u路径(@user)
以返回区分大小写的URL。但是没有比
user\u path(id:@user.slug\u区分大小写)
更好的方法了,这很难看,而且我不得不到处更改它,不确定是否可以在第三方gems中完成


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

在这种情况下可能会采用不同的方法:最有可能的情况是使用Nginx背后的Rails应用程序作为代理。然后,就可以将所有对配置文件的请求(其中包含大写字母)重写为规范变量。它将比发出额外的DB请求和使用整个Rails堆栈更快。此外,它的实现可能要简单得多。

您可以覆盖模型中的方法
normalize\u-friendly\u-id

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

它依赖于哪个接受一个
preserve\u case
选项。

我试图获取的不仅仅是第一个大写字母,可能是使用的不是最好的示例,不仅仅是/profile/Jon Smith,还有/profile/JonFK。实际上,这就是使用区分大小写的URL的意义所在,因为/profile/JonFK有其含义,而/profile/JonFK没有那么多含义