我有一个模型Playlist
,belongs_to
一个User
。而不是播放列表的路线
/playlists
/playlists/new
/playlists/:id
/playlists/:id/edit
我希望他们成为
/:username/playlists
/:username/playlists/new
/:username/:playlist_slug
/:username/:playlist_slug/edit
但是,这仍然有效:
playlist_path(@playlist)
# NOT: playlist_path(@playlist.user, @playlist)
由于路径的用户是@playlist.user
。每次需要路径时重复此参数都不是DRY。此外,这是一个风险,因为它允许虚假电话。例如playlist_path(@alice, @bob.playlists.first)
。
答案 0 :(得分:2)
我想你要求的 Friendly id和here是其实施。 希望这有帮助
答案 1 :(得分:0)
FriendlyID
就是你想要的:
#config/routes.rb
resources :users, path: "", only: [] do
resources :playlists #-> url.com/:user_id/playlists
end
#app/models/user.rb
class User < ActiveRecord::Base
has_many :playlists
extend FriendlyID
friendly_id :username, use: [:slugged, :finders]
end
这会自动使用paths
的 slug 值填充.find
和@user
方法:
#view
<%= link_to @playlist.name, user_playlist_path(@user, @playlist) %>
#app/controllers/playlists_controller.rb
class PlaylistsController < ApplicationController
def show
@user = User.find params[:user_id]
@playlist = @user.playlists.find params[:id]
end
end
-
根据FriendlyID docs,您需要执行以下操作才能设置它:
rails generate friendly_id #-> initializer
rails generate scaffold user name:string slug:string:uniq
rake db:migrate
您还需要更新User
模型,以确保每条记录都有slug
:
$ rails c
$ User.find_each(&:save)