使用 Friendly id 为具有不同 slug 值的相似名称生成有意义的 url- Rails 4

Using Friendly id to generate meaningful urls for similar names with different slug values- Rails 4

我已经设置好了Friendly Id following all the instructions from the Home page.

简而言之,我在 Place 模型 table.

中添加了 moduleslug

在我的 place.rb

  extend FriendlyId
  friendly_id :name, use: [:slugged, :finders, :history]

我也运行Place.find_each(&:save).

现在 name 的值可以不同,因为当我调用 show 动作时,索引动作中有很多地方具有相同的 names.So,使用 id,我得到正确的结果,但 urls 看起来很糟糕,但是,当我使用 friendly_id 调用显示操作时,url 在这里也很糟糕,因为它的 uniq 标记像附加的字符串一样,而且我总是得到错误的结果。

例如。 对于name值为burwood的记录,可以有多个条目too.However,有两个问题:-

  1. 我的 urls 应该像 www.mysite/sydney/burwood 而不是 www.mysite/sydney/21,如果我使用 id 而不是 friendly_id(这看起来很奇怪 - www.mysite/sydney/burwood-78894aa3-dea1-4915-b2f7-038182511005),如何处理。 ??
  2. If i dont use Id and use friendly_id as url parameter,For similar locations of value burwood,我总是得到第一条记录,即使我在数据库中要求其他 one.So,burwoodname 值有两条记录,我的 slug 值不同 - burwoodburwood-78894aa3-dea1-4915-b2f7-038182511005

所以如果使用 id 作为 url 参数,它的工作原理是 id 是 uniq 并且不考虑 slug,但我希望 url 更有意义。

但是,如果我使用 friendly_id,url 看起来很奇怪,而且没有提取唯一记录。

请帮忙

如果有很多地方同名,那么friendly_id会在 slug 的末尾附加一个 guid 以使其唯一。

您可以尝试使用 friend_id 候选人:

来自文档:

A new "candidates" functionality which makes it easy to set up a list of alternate slugs that can be used to uniquely distinguish records, rather than appending a sequence. For example:

class Restaurant < ActiveRecord::Base
  extend FriendlyId
  friendly_id :slug_candidates, use: :slugged

  # Try building a slug based on the following fields in
  # increasing order of specificity.
  def slug_candidates
    [
      :name,
      [:name, :city],
      [:name, :street, :city],
      [:name, :street_number, :street, :city]
    ]
  end
end

https://github.com/norman/friendly_id

或者,您可以通过覆盖 Place 模型中的 to_param 并使用 before_validation 过滤器设置 slug 来滚动自己的 slug。

before_validation :format_slug

def to_param
  slug
end

private

def format_slug
  self.slug = "#{name} #{id}".parameterize
  # You can define any rules for your slug here.
end

如果您希望 params[:id] 改为读取控制器中的 params[:slug],请在您的路由中设置 param: :slug

resources :places, param: :slug

在您的控制器中:

Place.find_by(slug: params[:slug])