2015-12-29 9 views
1

У меня есть модель, Playlist, которая belongs_to a User. Вместо маршрутов для плейлистов бытьДобавить имя пользователя владельца в Rails route

/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

Я думаю, что вы запрашиваете Friendly id и here - это его реализация. Надеюсь, что это помогает

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 и .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) 
+1

Спасибо за Подсказка. Однако я не нашел способ использовать FriendlyId, чтобы помочь мне превратить 'user_playlist_path (@user, @playlist)' в 'user_playlist_path (@playlist)'. –

+0

Ну, это не «дружелюбие», которое вам нужно для этого. Если вы хотите охватить путь для пользователя * one *, вам нужно жестко закодировать его в своих маршрутах или использовать 'current_user' в контроллере. Если вы дадите мне больше контекста, я напишу вам обновление –

 Смежные вопросы

  • Нет связанных вопросов^_^