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

时间:2015-12-16 12:22:22

标签: ruby-on-rails ruby-on-rails-4 routes friendly-id

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

/items/my-personal-item

但我想要的是:

/user1/my-personal-item

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

2 个答案:

答案 0 :(得分:1)

FriendlyID也支持Unique Slugs by Scope

由于您没有提供有关您的应用的一些信息,我无法给您一个确切的解释。

但我已根据您的网址创建了解释。

如果我是对的,那么您拥有ItemUser型号。 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]]即可。