Как я могу справиться с этим типом многоуровневых форм в рельсах - PullRequest
2 голосов
/ 06 октября 2011

Я в рельсах 3.1.У меня есть следующие модели

    class Tool < ActiveRecord::Base
        has_many :comments
    end

    class Comment < ActiveRecord::Base
        belongs_to :tool
        has_many :relationships
        has_many :advantages, :through => :relationships, :source => :resource, :source_type => 'Advantage'
        has_many :disadvantages, :through => :relationships, :source => :resource, :source_type => 'Disadvantage'

    end

    class Relationship < ActiveRecord::Base
        belongs_to :comment
        belongs_to :resource, :polymorphic => true
    end

    class Disadvantage < ActiveRecord::Base
        has_many :relationships, :as => :resource
        has_many :comments, :through => :relationships
    end

    class Advantage < ActiveRecord::Base
        has_many :relationships, :as => :resource
        has_many :comments, :through => :relationships
    end

Короче говоря, A Tool имеет много comments.Comment inturn связан с Advantages и Disadvantages.Поэтому на моей странице tool/show я бы перечислил все комментарии.

Но если бы мне пришлось добавить комментарий на страницу инструмента, была бы форма с текстовой областью для комментария и двумя multi select list boxesдля преимуществ и недостатков.

И здесь есть одна загвоздка, если пользователь хочет выбрать из существующего adv / disadv, пользователь может выбрать из списка или, если пользователь хочет добавить новый adv / disadv, онможете набрать его и добавить его, чтобы он был сохранен через вызов ajax и новый adv / disadv добавлен в список.Как я должен это сделать?

1 Ответ

5 голосов
/ 10 октября 2011

Вам нужны "вложенные формы" - они действительно просты в использовании.

в вашем добавлении Gemfile:

gem "nested_form"

1) в вашей main_model вы включите вызов accepts_nested_attributes_for :nested_model

class MainModel
  accepts_nested_attributes_for :nested_model
end

2) в представление для вашей main_model вместо form_for (), вы будете вызывать nested_form_for () вверху

= nested_form_for(@main_model) do |f|
   ...

Проверьте страницу Rails для этого метода, у него есть интересные опции, например: reject_if,: allow_destroy, ...

3) в представлении для main_model , когда вы хотите показать подформу для вложенной модели, вы будете делать

= f.fields_for :nested_model   # replace with your other model name

, тогда она будет просто использовать парциальную _form для nested_modelи вставьте его в представление для main_model

работает как шарм!

Проверьте эти эпизоды RailsCast.com, которые подробно охватывают Вложенные формы:

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

надеюсь, это поможет

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