Данный вопрос касается ключевых тем:
- Вложенные ресурсы
- Полиморфные ассоциации
- Формы
Мы предполагаем, что у нас есть фотографии и статьи, обе из которых имеют комментарии. Это создает нашу Полиморфную Ассоциацию.
#Photo Model -> photo.rb
class Photo < ActiveRecord::Base
has_many :comments, :as => :commentable
accepts_nested_attributes_for :comments
end
#Article Model -> article.rb
class Article < ActiveRecord::Base
has_many :comments, :as => :commentable
accepts_nested_attributes_for :comments
end
#Comment Model -> comment.rb
class comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
Наше представление для добавления и просмотра комментариев разделяется фотографиями и статьями.
#Index View
<%= form_for [@comment] do |f| %>
<%= render 'form', :f => f %>
# more code...
<% end %>
И, наши ресурсы Фотографии и статьи вложены в другие ресурсы так:
# Routes.rb
namespace :galleries do
resources :photos do
resources :comments
end
end
namespace :blogs do
resources :articles do
resources :comments
end
end
Теперь вы можете видеть в приведенной выше форме, что у нас есть наш полиморфный ресурс, но нам нужны наш ресурс Parent и ресурс Grand-Parent, в зависимости от пути нашего запроса. Если бы он был жестко запрограммирован (никогда не буду делать это), у нас был бы один из этих двух в форме:
<%= form_for [:galleries, :photos, @commetns] do |f| %>
или
<%= form_for [:blogs, :articles, @commetns] do |f| %>
Предполагая, что мы можем найти родителя в нашем CommentsController, как было найдено во многих статьях, и Stackoverflow отвечает примерно так:
def find_medical_loggable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
end
Как мы можем найти бабушек и дедушек и поместить все это в помощник form_for?
Очень ценю это!