如何为模型创建自定义路径?

How can I make a custom path for a model?

我正在使用 FriendlyID 使我的 URL 看起来不错,所以我现在得到的是:

/items/my-personal-item

但我想要的是:

/user1/my-personal-item

其中 user1 是拥有 my-personal-item 的用户的用户名。

FriendlyID 也支持 Unique Slugs by Scope.

因为你没有提供关于你的应用程序的一些信息,我无法给你一个确切的解释。

但我根据您的 url 创建了一个解释。

如果我是对的,那么你有一个 Item 和一个 User 模型。 Item型号属于User型号,User型号有多个Item

以下是我解决这个问题的方法:

型号:

# User model
class User < ActiveRecord::Base
  extend FriendlyId
  has_many :items
  friendly_id :name, :use => :slugged
end

# Item model
class Item < ActiveRecord::base
  extend FriendlyId
  belongs_to :user
  friendly_id :name, :use => :scoped, :scope => :user
end

控制器:

class ItemsController < ApplicationController
  before_action :set_user, :set_item

  def show
    # Show your item ...
  end

  private

  def set_user
    User.friendly.find(params[:user_id])
  end

  def set_item
    @user.items.friendly.find(params[:item_id])
  end
end

路线:

Rails.application.routes.draw do
  get ':user_id/:item_id' => 'items#show'
end

这是未经验证的最小实现。希望对您有所帮助。

编码愉快:)

#config/routes.rb
resources :users, path: "" do
   resources :items, path: "", only: [:show, :index] #-> url.com/:user_id/
end

FriendlyID 必须驻留在您正在使用的任何模型中,因此如果您想在 UserItem 上使用它,您必须使用以下设置:

#app/models/user.rb
class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :username
end

#app/models/item.rb
class Item < ActiveRecord::Base
  extend FriendlyId
  friendly_id :title
end

这应该使您能够调用:url.com/user-name/my-personal-item

--

如果您想通过适当的控制器操作来支持这一切,您可以使用以下方法:

#app/controllers/items_controller.rb
class ItemsController < ApplicationController
   def show
     @user = User.find params[:user_id]
     @item = @user.items.find params[:id]
   end
end

作为专业提示,您需要查看 friendly_id 初始化程序来为您的应用设置一些默认值:

#config/initializers/friendly_id.rb
config.use :slugged #-> make sure this is valid
config.use :finders #-> make sure this is valid

通过设置以上选项,您将能够在您的模型中调用 friendly_id [[attribute]]