如何为模型创建自定义路径?
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
必须驻留在您正在使用的任何模型中,因此如果您想在 User
和 Item
上使用它,您必须使用以下设置:
#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]]
。
我正在使用 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
必须驻留在您正在使用的任何模型中,因此如果您想在 User
和 Item
上使用它,您必须使用以下设置:
#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]]
。