将所有者的用户名添加到Rails路由

时间:2015-12-29 11:37:13

标签: ruby-on-rails friendly-id

我有一个模型Playlistbelongs_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)

2 个答案:

答案 0 :(得分:2)

我想你要求的 Friendly idhere是其实施。 希望这有帮助

答案 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)