我为新的rails应用程序安装了friendly_id
gem,以便为用户配置文件创建漂亮的URL。一切正常,但我希望旧的(丑陋的)URL返回404页面,因为它应该是正常的。此时,可以通过以下两个URL获得用户个人资料:
我正在使用的路线规则:
get 'profile/:id', to: 'users#show', as: 'user'
用户控制器:
class UsersController < ApplicationController
def show
@user = User.friendly.find(params[:id])
end
end
奇怪的是我在网上找不到任何可以帮助我解决这个问题的内容,所以对此有任何想法?
答案 0 :(得分:1)
我实际上发现这个东西没有出现在当前的gem文档中。
class UsersController < ApplicationController
def show
@user = User.find_by_slug!(params[:id])
end
end
如果其他人需要它,请留在这里
<强>更新强>
此外,使用history
模块意味着使用@user = User.friendly.find(params[:id])
首先搜索slug列中的匹配项,然后搜索过去的slug,最后搜索id
。基本上,使用history
模块将/profile/past-friendly-id
和/profile/id
与301
重定向到/profile/current-friendly-id
,我希望/profile/id
只返回{{} 1}}代码和页面。
这让我想出一个更清晰的解决方案,将404
的finder方法改为仅通过friendy-id进行搜索:
gem
答案 1 :(得分:1)
很高兴见到你修好了!
我打算提出类似的建议;因为我在这里,我不妨写一下你也可以使用find_by
方法实现相同的功能:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find_by slug: params[:id]
end
end
-
您还可以让您的路线更清晰:
#config/routes.rb
resources :users, path: "profile", only: :show, as: :user
<强>更新强>
如果您想使用history
模块,则必须使用以下内容:
#app/models/user.rb
class User < ActiveRecord::Base
friendly_id :username, use: [:finders, :slugged, :history]
end
...或者,您也可以全局设置history
模块:
#config/initializers/friendly_id.rb
...
config.use :finders
config.use :history
config.use :slugged
这将基本上将你的slug复制到另一个表(默认称为friendly_id_slugs
),FriendlyID
将来会查看它:
#config/application.rb
FriendlyId::Slug.table_name = "slugs"
我们使用以下内容将我们的表格更改为slugs
:
-
一个重要的注意事项是history
模块仅适用于之前的slugs。
您最初的问题是关于使用ids
,而不是之前的slu ..如果你只想查看以前的slu ,,是的,你可以使用User.friendly.find(params[:id])
答案 2 :(得分:0)
让我们为自己尝试遵循代码段。
class UsersController < ApplicationController
def show
if params[:id].to_s.match(/^[0..9]+$/) && !User.friendly.exists?(params[:id])
render "public/404.html", status: 404
else
@user = User.friendly.find params[:id]
end
end
end
希望能帮助你。