friendly_id gem友好网址不适用于1个模型,但适用于其他模型吗?

时间:2019-01-08 01:51:26

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

问题:我已经安装了friendly_id gem,它正在按我的Users表的方式工作,但是对于我的清单模型,使用:name而不是:id的友好URL不是没有工作。

简而言之,这是我的列表控制器

    def show
        @order = @listing.orders.new()
#as you can see, I have no need for a find because i noticed i didn't need it for the show page to show up correctly - idk
    end

    private

    def set_listing
          @listing = Listing.find(params[:id])
    end

令我困惑的是,我什至不需要@listing=Listing.find(params[:id]

之类的东西

我在演出中尝试使用了此@listing=Listing.friendly.find(params[:id]

但是没有什么区别。我还尝试过更改“ set_listing”方法以包含友好的代码段,但这也无济于事-即使无法正常工作,也只能尝试一下。

我将其包含在模型中-就像我为“用户”表所做的一样

extend FriendlyId
  friendly_id :name, use: :slugged

例如,我有我的列表,编号:1,名称:列表测试1,子弹:listing-test-1

我转到domain.com/listings/listing-test-1,我得到了

找不到带有'id'= listing-test-1的列表

我所做的一切都与处理Users表相同,但似乎不起作用。

问题:是否有可能干扰此问题?

2 个答案:

答案 0 :(得分:0)

FriendlyId不会覆盖模型上的默认.find方法。至少自从2013年发布第5版以来,至少没有。

要基于id和slug列查找记录,您需要显式调用.friendly.find

class ListingsController < ApplicationController

  before_action :set_listing, only: [:show, :edit, :update, :destroy]

  # ...

  def show
    @order = @listing.orders.new()
  end

  # ...

  private

  def set_listing
    @listing = Listing.friendly.find(params[:id])
  end

  # ...
end

当前出现错误的原因很可能是before_action :set_listing在调用show操作之前调用了set_listing方法。

class ListingsController
  before_action :set_listing, only: [:show, :edit, :update, :destroy]

  def show
    # this line is never reached - and should not really be needed anyways
    @listing = Listing.friendly.find(params[:id])
    @order = @listing.orders.new()
  end

  private

  def set_listing
    # will raise ActiveRecord::NotFoundError
    @listing = Listing.find(params[:id])
  end
end

由于Listing.find(params[:id])将引发ActiveRecord::NotFoundError,因此您将永远无法执行演出动作。解决方案只是首先修复回调方法。

答案 1 :(得分:0)

我在开发 Rails 6 应用程序时遇到了同样的挑战。

我是这样解决的

默认情况下,Friendly_id gem 不会为 Rails 应用程序中的现有记录生成 slug。因此,如果您有模型的现有记录,则不会为它们生成 slug。它们只会为较新的记录生成。

要为现有记录生成 slug,请执行以下操作。假设我们的模型名称是 Listing,我们要用于 slug 的列是 name,只需执行以下操作:

使用以下命令启动 Rails 控制台:

rails console

并运行以下命令为现有记录生成 slug:

  Listing.find_each(&:save)

重新启动 Rails 服务器,然后再次检查。您现在应该会看到所有记录的 slug。

仅此而已。

我希望这会有所帮助

相关问题