Можно ли использовать как вложенные, так и мелкие ресурсы в рельсах?Как написать контроллер / просмотры? - PullRequest
4 голосов
/ 23 февраля 2011

У меня есть ресурсы, для которых имеет смысл обратиться к ним как к вложенным с другими ресурсами, так и по отдельности.Т.е. я ожидаю использовать все URL-адреса, подобные этим:

/account/4/transfers   # all transfers which belong to an account
/user/2/transfers      # all transfers input by specific user
/project/1/transfers   # all transfers relevant to a project
/transfers             # all transfers

Меня интересует, как мне написать действия TransfersController (например, index), так как это удвоит логику, найденную в родительских моделях - есть ли лучший способ, чемделать что-то вроде

TransfersController
...
def index
  if !params[account_id].nil?
    @account = Account.find(params[account_id])
    @transfers = @account.transfers
  elsif !params[user_id].nil?
    @user = User.find(params[user_id])
    if @user.accesible_by?(current_user)
      @transfers = @user.transfers
    end
  elsif !params[projects_id].nil?
    .....

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

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

1 Ответ

3 голосов
/ 23 февраля 2011

У меня есть открытый вопрос по этому вопросу.В моем вопросе я обрисовал 2 метода, которые я придумал.Я использую второй в настоящее время, и он работает довольно хорошо.

Маршрутизация вложенных ресурсов в Rails 3

Маршрут, который я использую, немного отличается, потому что я использую имена пользователей вместо идентификаторов, и я хочу ихпервый.Вы бы придерживались чего-то вроде:

namespace :projects, :path => 'projects/:project_id' do
  resources :transfers #=> controllers/projects/transfers_controller.rb
end

# app/controllers/projects/transfers_controller.rb
module Projects
  class TransfersController < ApplicationController
    # actions that expect a :project_id param
  end
end

# app/controllers/transfers_controller.rb
class TransfersController < ApplicationController
  # your typical actions without any project handling
end

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

...