使用 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.
中添加了 module
和 slug
列
在我的 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,有两个问题:-
- 我的 urls 应该像
www.mysite/sydney/burwood
而不是 www.mysite/sydney/21
,如果我使用 id
而不是 friendly_id
(这看起来很奇怪 - www.mysite/sydney/burwood-78894aa3-dea1-4915-b2f7-038182511005),如何处理。 ??
- If i dont use Id and use
friendly_id
as url parameter,For similar locations of value burwood,我总是得到第一条记录,即使我在数据库中要求其他 one.So,burwood
的 name
值有两条记录,我的 slug 值不同 - burwood
和 burwood-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])
我已经设置好了Friendly Id following all the instructions from the Home page.
简而言之,我在 Place 模型 table.
中添加了module
和 slug
列
在我的 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,有两个问题:-
- 我的 urls 应该像
www.mysite/sydney/burwood
而不是www.mysite/sydney/21
,如果我使用id
而不是friendly_id
(这看起来很奇怪 - www.mysite/sydney/burwood-78894aa3-dea1-4915-b2f7-038182511005),如何处理。 ?? - If i dont use Id and use
friendly_id
as url parameter,For similar locations of value burwood,我总是得到第一条记录,即使我在数据库中要求其他 one.So,burwood
的name
值有两条记录,我的 slug 值不同 -burwood
和burwood-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])