Отказ от ответственности: первый месяц разработки с рельсами, но я прочитал все, что смог найти.
Редактировать: Почему-то я пропустил этот очень похожий вопрос с аналогичным окончательным ответом.
У меня есть полиморфные флаги:
Class Flag...
belongs_to :flaggable, :polymorphic => true
...
end
У меня есть вложенные ресурсы с соответствующим оператором has_many: flags,: as =>: flaggable.
resources :posts do
resources :comments
end
Мне бы хотелосьи посты, и комментарии, и в будущем другие вещи на сайте будут помечены. Что такое СУХОЙ / стандартный способ (я использую Rails 3.1) для этого в отношении маршрутов и контроллера?
Что я сделал для маршрутов:
В основном на основе этого рельса, приведенного , я сделал флаги как вложенный ресурс как постов, так и комментариев.Я уже думаю, что я на неправильном пути, потому что кажется, что он повторяет полиморфные отношения в моделях, а также нарушает принцип, согласно которому «Ресурсы никогда не должны быть вложены глубже, чем на один уровень».
resources :posts do
resources :flags
resources :comments do
resources :flags
end
end
В качестве альтернативы я подумал о том, чтобы реализовать маркируемые маршруты отдельно, как показано ниже.Но опять же, это не кажется СУХИМЫМ и дополнительно создает нежелательные независимые маршруты для комментариев.
resources :posts do
resources :flags
end
resources :comments do
resources :flags
end
Наконец, мне стало интересно, смогу ли я сделать общий ресурс для флагманских объектов.Я не мог найти способ реализовать это, и у него есть та же проблема, что и в предыдущем способе сделать общие маршруты доступными для универсального типа flaggable.
resources :flaggable do
resources :flags
end
Что я сделал для контроллера дляперечисленные выше вложенные ресурсы:
Я реализовал find_flaggable, но понял, что для вложенных ресурсов параметром, который преобразуется в класс flaggable, может быть либо Post, либо Comment, поскольку оба они заканчиваются параметрами (post_id и comment_id).Я мог бы решить нижеприведенный список приоритетов идентификатора для текущей настройки, но это не общее решение и делает его еще менее СУХИМЫМ, чем оно уже есть.
def find_flaggable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
Так вот где яостановился (на самом деле реализовал ограниченное решение только для сообщений и комментариев) и понял, что не знаю удовлетворительного способа сделать это.Кто-нибудь может помочь?