Rails / Friendly_id。如何为旧(丑陋)URL呈现404页面

时间:2016-01-08 13:04:54

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

我为新的rails应用程序安装了friendly_id gem,以便为用户配置文件创建漂亮的URL。一切正常,但我希望旧的(丑陋的)URL返回404页面,因为它应该是正常的。此时,可以通过以下两个URL获得用户个人资料:

  • 丑陋(旧)网址:/ profile / 11
  • 漂亮的网址:/ profile / jon-smith

我正在使用的路线规则:

get 'profile/:id', to: 'users#show', as: 'user'

用户控制器:

class UsersController < ApplicationController
    def show
        @user = User.friendly.find(params[:id])
    end
end

奇怪的是我在网上找不到任何可以帮助我解决这个问题的内容,所以对此有任何想法?

3 个答案:

答案 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/id301重定向到/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

enter image description here

-

一个重要的注意事项是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

希望能帮助你。