Rails 3.1 - Как организовать несколько действий с индексами для одной и той же модели? - PullRequest
3 голосов
/ 10 марта 2012

У меня есть модель User, которая имеет проекты has_many.Модель проекта принадлежит к пользовательской модели.В настоящее время я использую индексное действие projects_controller.rb для отображения всех проектов, созданных для всех пользователей (Project.all).

На отдельной странице я также хотел бы отобразить все проекты, принадлежащие конкретному пользователю (т.е. перейти на страницу и увидеть все проекты, принадлежащие данному пользователю)..

Мне сложно определить, какой контроллер / действие / представление использовать и как настроить маршруты, потому что я уже использовал действие index для projects_controller для отображения всех проектов.У кого-нибудь есть предложения?

Ответы [ 4 ]

3 голосов
/ 10 марта 2012

Вы можете сделать / users / {: id} / projects, которые будут сопоставлены с действиями проектов контроллера пользователя.Маршрут должен быть пользовательским действием

resources :users do
  member do
    get 'projects'
  end
end
2 голосов
/ 10 марта 2012

вместо того, чтобы иметь разные страницы листинга. использовать одну и ту же индексную страницу на основе разных критериев, то есть фильтров.

URL

match ":filter/projects", :to => "projects#index"

внутри контроллера что-то вроде

case params[:filter]
when "all"
  @projects = Project.all
when "user" 
  @projects = current_user.projects
when "batch"
  # ..
else
  # ..
end
0 голосов
/ 10 марта 2012

Вы должны вложить projects в users, чтобы получить рабочий код / ​​пути вроде: /users/1/projects без какого-либо дополнительного кодирования, поэтому вам нужно изменить строки ресурсов в routes.rb на:

resources :users, :shallow => true do 
  resources :projects
end

и затем в Projects # show action вместо Project.find(params[:id]) вам нужно получить Project.find(params[:user_id])

Кажется, это правильно

0 голосов
/ 10 марта 2012

Как насчет того, чтобы вы отображали проекты, принадлежащие определенному пользователю, на странице User#show?

Возможно, что-то вроде этого:

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  # rest of class omitted...

Затем вы можете получить доступ к проектам, которые принадлежатпользователю в представлении для страницы показа, позвонив @user.projects.

...