问题:我已经安装了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表相同,但似乎不起作用。
问题:是否有可能干扰此问题?
答案 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。
仅此而已。
我希望这会有所帮助