вложенные ресурсы в разработке

Я новичок в рельсах, и мне нужен совет по поводу моих маршрутов и правильной логики маршрутизации. Я работаю над очень простым приложением, в котором пользователи могут публиковать списки. Пользователь (модель разработки) имеет много списков, и этот список принадлежит пользователю. В моей таблице списка есть user_id:integer. Когда пользователь успешно входит в систему, я хотел бы, чтобы они видели свои списки на соответствующей странице маршрута. Я создал вложенные маршруты так:

devise_for :users, :paths => 'users'

resource :users do
  resource :lists
end

Это результат моих рейк-маршрутов

new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
             users_lists POST   /users/lists(.:format)         lists#create
         new_users_lists GET    /users/lists/new(.:format)     lists#new
        edit_users_lists GET    /users/lists/edit(.:format)    lists#edit
                         GET    /users/lists(.:format)         lists#show
                         PATCH  /users/lists(.:format)         lists#update
                         PUT    /users/lists(.:format)         lists#update
                         DELETE /users/lists(.:format)         lists#destroy
                   users POST   /users(.:format)               users#create
               new_users GET    /users/new(.:format)           users#new
              edit_users GET    /users/edit(.:format)          users#edit
                         GET    /users(.:format)               users#show
                         PATCH  /users(.:format)               users#update
                         PUT    /users(.:format)               users#update
                         DELETE /users(.:format)               users#destroy
                    root GET    /                              static_pages#home

Как я могу сделать так, чтобы мои маршруты достигли этого:

/users/:user_id/lists(.:format)

Это также было бы отправной точкой, чтобы убедиться, что пользователь имеет доступ только к своим спискам.


person Michael Brooks    schedule 30.12.2014    source источник


Ответы (3)


Возможно, вы захотите использовать ресурс списка во множественном числе, а ресурс пользователя — в единственном числе:

resource :user do
  resources :lists
end

Во второй части просто загрузите списки на основе текущего пользователя, где они вам нужны.

@lists = current_user.lists
person NM Pennypacker    schedule 30.12.2014
comment
Спасибо, это было то, что мне было нужно. Быстрое сопровождение. Как мне сослаться на :id текущего пользователя в моем lists_controller. Нужен ли мне какой-то особый синтаксис из-за разработки? Я получаю сообщение об обнаружении циклической зависимости для пользователей/списков (индекс) - person Michael Brooks; 31.12.2014
comment
@Michael Brooks, у вас также есть доступ к current_user в ваших контроллерах. Просто сделайте current_user.id - person NM Pennypacker; 31.12.2014

Вы должны использовать метод resources вместо resource:

resources :users do
  resources :lists
end

Взгляните на эту статью о руководствах по Rails. Она содержит хороший пример с объяснения.

И для этого:

Это также было бы отправной точкой, чтобы убедиться, что пользователь имеет доступ только к своим спискам.

Вы можете использовать один из вспомогательных методов Devise: current_user:

current_user.lists

UPD: Но мне кажется проще создавать списки как отдельный (не вложенный) ресурс. Что-то вроде этого:

# config/routes.rb
Rails.application.routes.draw do
  # ...
  resources :lists
end

# app/controllers/lists_controller.rb
class ListsController < ApplicationController
  before_action :authenticate_user!

  def index
    @lists = current_user.lists
  end
end

Итак, по пути /lists какой-то пользователь получит доступ только к своим спискам. Вот и все.

person schfkt    schedule 30.12.2014

Я думаю, что вы можете сделать эту работу следующим образом:

resources :users do resources :lists end Ключевым моментом является множественное число.

Здесь ссылка на эту часть документации

Я бы использовал авторизацию, такую ​​​​как cancancan или pundit, чтобы контролировать, какие списки пользователь может или не может видеть. Надеюсь, это поможет!

person Ross    schedule 30.12.2014