Как сгенерировать соответствующие помощники по маршруту для унаследованного ресурса в Ruby on Rails с использованием наследования одной таблицы (STI) - PullRequest
1 голос
/ 16 апреля 2011

У меня есть два ресурса: FaxRequest и InternetRequest, которые оба наследуют от Request. Я сгенерировал каждый из трех ресурсов с помощью команды rails scaffold resource, а затем изменил модели для наследования от Request следующим образом:

#request.rb
class Request < ActiveRecord::Base
end

#fax_request.rb
class FaxRequest < Request
end

#internet_request.rb
class InternetRequest < Request
end

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

#request_controller.rb
def index
  @requests = Request.all
end


#views/requests/index.html.haml
=@requests.each do |request|
  = request.date
  = link_to('show', request)
  = link_to('edit', ?)
  = link_to('delete' ?)

Я вижу, что link_to('view', request) достаточно умен, чтобы сгенерировать ссылку на соответствующий ресурс, но откуда Rails узнает, генерировать ли edit_fax_request_path(request) или edit_internet_request_path(request) на основе подкласса запроса ? То же самое касается нового и удаления?

Во-вторых, мне любопытно узнать, каков идеологический подход к ИППП. Один контроллер или три в этом случае? Я иду о проблеме все неправильно. Мне кажется, у Rails был бы аккуратный способ справиться с этой проблемой, но я гуглил и ничего не могу найти. Возможно, я не задаю правильный вопрос?

1 Ответ

4 голосов
/ 22 августа 2011

Все, что вам нужно сделать, это использовать вспомогательный метод edit_request_path(request) для ссылки редактирования. Что касается ссылки на удаление, здесь приведен код ссылки для удаления, который будет сгенерирован скаффолдингом и будет работать, как только вы сделаете, как я обрисовал ниже:

= link_to( 'Destroy', request, :confirm => 'Are you sure?', :method => :delete )

Затем отредактируйте файл маршрутов, сообщив rails, чтобы сгенерировать соответствующие маршруты для перехода к контроллеру request следующим образом (обратите внимание, вам может не понадобиться часть map):

map.resources :requests
map.resources :fax_requests, :controller => :requests
map.resources :internet_requests, :controller => :requests

Таким образом, все маршруты генерируются так, как вы ожидаете, и все они идут к главному контроллеру, от которого они унаследованы.

Обновление: нашел отличную статью, рассказывающую об этом (и предупреждает о том, что я говорю)

http://code.alexreisner.com/articles/single-table-inheritance-in-rails.html /2422252/luchshie-praktiki-dlya-obrabotki-marshrutov-dlya-podklassov-sti-v-relsah

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...