2013-08-04 4 views
1

Я пытаюсь настроить маршруты для модели «Страница», вложенной в модель «Пользователь». Только «Страницы» должны быть ресурсами. (has_many пользователя страницы)Добавление: user_id к ресурсу (rails3 routing)

Это оригинальный способ я сделал это:

resources :users, path: '', only: [] do 
    resources :pages, path: '' 
end 

выше работал для меня просто отлично. Маршруты, которые я получил были:

 user_pages GET /:user_id(.:format)     pages#index 
       POST /:user_id(.:format)     pages#create 
    new_user_pages GET /:user_id/new(.:format)    pages#new 
edit_user_pages GET /:user_id/:id/edit(.:format)  pages#edit 
     user_pages GET /:user_id/:id(.:format)    pages#show 
       PUT /:user_id/:id(.:format)    pages#update 
       DELETE /:user_id/:id(.:format)    pages#destroy 

Это имело смысл для меня, потому что /john-doe/page1 будет user_pages_path(@user, @user.pages.first).

Однако new_user_pages не имеет смысла, поскольку пользователь может сделать только страницу для себя. Поэтому каждый пользователь должен посетить/new, а не «/: user_id/new». Кроме того, что происходит, если пользователь посещает другой пользовательский «: another_user_id/new»? (было бы целесообразнее делать new_pages_path и '/ new' вместо new_user_pages_path и /:user_id/new).

Другой способ, которым я пытался сделать выше маршрутизации:

Я также понял, что выше может быть достигнуто в течение более короткого пути из-за того, что «: пользователи» не нужно быть изобретательным:

resources :pages, path => :user_id 

Однако это привело к дорожкам без "пользователь" в них:

 pages GET /:user_id(.:format)     pages#index 
      POST /:user_id(.:format)     pages#create 
    new_pages GET /:user_id/new(.:format)    pages#new 
edit_pages GET /:user_id/:id/edit(.:format)  pages#edit 
     pages GET /:user_id/:id(.:format)    pages#show 
      PUT /:user_id/:id(.:format)    pages#update 
      DELETE /:user_id/:id(.:format)    pages#destroy 

Что это за «рельсы»? Кроме того, следует ли удалить «новый» из ресурса и определить его отдельно?

Кроме того, имеет ли смысл использовать сферу или имен вместо?

Спасибо, Ник

ответ

0

Почему вы не хотите, чтобы ваши маршруты следовать формату new_user_pages_path? Могут быть причины сделать это так, как вы хотите, о которых я не знаю, но для меня это намного проще, когда все мои вложенные пути ресурсов соответствуют одному и тому же формату.

Чтобы ответить на ваш вопрос о предотвращении пользователя от посещения /:another_user_id/new, вы можете предотвратить это, добавив before_filter, чтобы убедиться, что идентификатор получения передается новому действию соответствует идентификатор пользователя, вошедшего в систему.

Это то, что я использую в приложении, я в здании в настоящее время:

things_controller.rb 

class VendorsController < ApplicationController 
    #other filters 
    before_filter :correct_user 

    #controller methods 

    private 
    def correct_user 
     if params[:user_id] 
     @user = User.find(params[:user_id]) 
     unless @user && current_user == @user 
      redirect_to(root_path) 
     end 
     else 
     redirect_to(root_path) 
     end 
    end 
end 

конечно, вам нужен метод current_user для этой работы (шахта приходит от завещанию).

+0

Да, я реализовал нечто похожее на ваш 'correct_user'. Я просто подумал, что будет выглядеть проще/лучше, если новый путь создания страницы - 'example.com/new', а не' example.com/johndoe/new'. – Nick

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