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

Posted

技术标签:

【中文标题】如何使用 Rails / Friendly-Id 制作区分大小写的 URL?【英文标题】:How to make case sensitive URLs with Rails / Friendly-Id? 【发布时间】:2016-04-14 21:55:19 【问题描述】:

我正在使用 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 downcase 的 slug,只匹配和接受小写 URL,404ing 其他所有内容。

可行的解决方案是保持slug_case_sensitive (Jack-Wild) 以及slug (jack-wild) 的默认小写版本。

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

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

修改创建和更新 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

假设 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 %> 以返回区分大小写的 URL。但是不知道有比user_path(id:@user.slug_case_sensitive) 更好的方法,这很丑陋,而且我不得不到处更改它,不确定是否可以在 3rd 方宝石中完成...

对此的任何想法都会有所帮助并不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

我试图获得的不仅仅是首字母大写,也许使用的例子不是最好的,不仅仅是/profile/Jon-Smith,还有/profile/JonFK .这实际上是使用区分大小写的 URL 有意义的地方,因为 /profile/JonFK 有意义,而 /profile/Jonfk 则没有那么多【参考方案2】:

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

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

它依赖于接受preserve_case 选项的ActiveSupport parameterize。

【讨论】:

以上是关于如何使用 Rails / Friendly-Id 制作区分大小写的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 6 中使用茧宝石

Rails:如何使用 Rails 控制台列出数据库表/对象?

如何使用 ajax-datatables-rails 理解 Rails 中的包含

如何在 Webpacker 中使用 Rails Url 助手/Rails 5.1 中的 React-rails

如何在 Rails 之外使用 Rails 3 的 ActiveSupport 核心扩展 [重复]

Rails 4:如何使用 AJAX 上传文件