我正在使用FriendlyID让我的网址看起来不错,所以我现在得到的是:
/items/my-personal-item
但我想要的是:
/user1/my-personal-item
user1
是拥有my-personal-item
的用户的用户名。
答案 0 :(得分:1)
FriendlyID也支持Unique Slugs by Scope。
由于您没有提供有关您的应用的一些信息,我无法给您一个确切的解释。
但我已根据您的网址创建了解释。
如果我是对的,那么您拥有Item
和User
型号。 Item
模型属于User
模型,User
模型有Item
个。{/ p>
以下是我将如何解决这个问题:
<强>型号:强>
# 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
这是一个没有验证的最小实现。我希望这会有所帮助。
快乐编码:)
答案 1 :(得分:1)
#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]]
即可。