【问题标题】:Using Friendly id to generate meaningful urls for similar names with different slug values- Rails 4使用 Friendly id 为具有不同 slug 值的相似名称生成有意义的 url-Rails 4
【发布时间】:2017-06-24 05:40:27
【问题描述】:

我已经按照Home page 的所有说明设置了Friendly Id

简而言之,我在我的 Place 模型表中添加了 moduleslug 列。

代替我。rb

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

我也跑了Place.find_each(&:save)

现在name 的值可以不同,因为有很多相同名称的地方。所以在索引操作中,当我调用显示操作时,使用id,我得到正确的结果,但网址看起来很糟糕,但是,当我使用friendly_id 调用显示操作时,url 在这里也很糟糕,它的 uniq 令牌(如字符串),而且我总是得到错误的结果。

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

  1. 如果我使用的是id 而不是friendly_id,我的网址应该是www.mysite/sydney/burwood 而不是www.mysite/sydney/21(这看起来很奇怪 - www.mysite/sydney/burwood-78894aa3-dea1-4915 -b2f7-038182511005),如何处理。 ??
  2. 如果我 使用 Id 并使用 friendly_id 作为 url 参数,对于类似的位置值 burwood,即使我要求,我总是会获得第一条记录另一个。所以在 DB 中,name 的值 burwood 有两条记录,我的 slug 值不同 - burwoodburwood-78894aa3-dea1-4915-b2f7-038182511005

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

但是,如果我使用 friendly_id,url 看起来很奇怪,并且不会获取唯一记录。

请帮忙

【问题讨论】:

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


    【解决方案1】:

    如果有许多同名的地方,则friendly_id 将在 slug 的末尾附加一个 guid 以使其唯一。

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

    来自文档:

    一个新的“候选”功能,可以轻松设置可用于唯一区分记录的替代 slug 列表,而不是附加序列。例如:

    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])
    

    【讨论】:

    • 我可以通过使用 to_param 来实现这一点,但是我怎样才能使我的网址漂亮?我不想在网址中显示我的 ID...
    • 您可以添加guid 列并使用SecureRandom.hex(4) 生成唯一ID,以创建随机唯一字符串/ID。长度将是值的两倍,因此如果我们使用 4 的值,则长度为 8 个字符。
    • 如果你愿意,我可以添加一个例子。
    • 是的...当然...@codyeatworld
    猜你喜欢
    • 2013-09-11
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多