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

时间:2016-01-10 15:26:43

标签: ruby-on-rails friendly-url friendly-id

我正在使用Friendly-Id gem创建漂亮的网址。我想创建区分大小写的网址,并将同一网址的所有其他案例版本重定向到具有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的slu and,只匹配并接受小写网址,404其他所有内容。

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

然后使用Friendly_Idslug进行params[:id].downcase搜索,如果params[:id] != slug_case_sensitive重定向到首选网址(/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)更好的方法是丑陋的,而且我必须在任何地方改变它并且不确定它是否可以在第三方宝石中完成......

任何关于此的想法都会有所帮助并且非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

它依赖ActiveSupport parameterize接受preserve_case选项。