Rails 3 вложенных ресурса, полиморфные ассоциации и формы - PullRequest
1 голос
/ 15 декабря 2011

Данный вопрос касается ключевых тем:

  1. Вложенные ресурсы
  2. Полиморфные ассоциации
  3. Формы

Мы предполагаем, что у нас есть фотографии и статьи, обе из которых имеют комментарии. Это создает нашу Полиморфную Ассоциацию.

#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?

Очень ценю это!

...