отредактированный для ясности. Страница OSGi дала лучший простой ответ, чем мой
А простой ответ: Платформа услуг OSGi обеспечивает стандартизированную, ориентированную на компонент вычислительную среду для сотрудничающих сетевых услуг. Эта архитектура значительно уменьшает полную сложность здания, поддержания и развертывания приложений. Платформа услуг OSGi обеспечивает функции для изменения состава динамично на устройстве множества сетей, не требуя перезапусков.
В единственной структуре приложения, скажем Eclipse IDE, это не имеет большого значения для перезапуска, когда Вы устанавливаете новый плагин. Используя реализацию OSGi полностью, необходимо быть в состоянии добавить плагины во времени выполнения, получить новую функциональность, но не иметь для перезапуска затмения вообще.
Снова, не грандиозное предприятие в течение каждого дня, использования небольшого приложения.
, Но, когда Вы начинаете смотреть на мультикомпьютер, платформы распределенного приложения, это - то, где он начинает становиться интересным. Когда у Вас должно быть 100%-е время работы для критических систем, возможность заменить компоненты в горячем режиме или добавить, что новая функциональность во времени выполнения полезна. Предоставленный, существуют возможности того, чтобы сделать это теперь по большей части, но OSGi пытается связать все в миленькую платформу с едиными интерфейсами.
Делает OSGi, решают типичные проблемы, я не уверен в этом. Я имею в виду, это может, но издержки не могут стоить того для более простых проблем. Но это - что-то для рассмотрения, когда Вы начинаете иметь дело с большим, сетевым, приложениями.
У вас двоих есть проблемы, к сожалению, один из них замаскирован другим.
Обе проблемы проистекают из этой части представления:
<div class="association">
<% fields_for :associations do |assoc_form| %>
<%= assoc_form.collection_select(:association_id, Association.find(:all),
:id, :name, :include_blank => true) %>
Проблема 1: Вы неправильно поняли, что делает accept_nested_fields_for.
accept_nested_fields_for используется для создания и изменения связанных объектов в форме. Его можно использовать для заполнения таблицы соединений, что вы и пытаетесь сделать. Однако использование accept_nested_fields_for для заполнения таблицы соединения невозможно с отношением HABTM. Хорошо использовать accept_nested_fields_for, если вы хотите создать новую ассоциацию, которая будет связана с новым поверенным. Или если у вас есть расширенная модель соединения, которая требует дополнительной информации для каждой записи.
Проблема 2: Вы не связываете поля в этой форме с формой поверенного. Что необходимо для использования accept_nested_fields_for.
Мы уже установили, что accept_nested_fields_for - это не то, что вам нужно для этого, но вы по-прежнему не связываете поле select association_id с формой. Вот почему был установлен параметр params [Association] [association_id], а не params [attorney] [Association] [association_id].
Проблема 3: Структура формы неверна для того, что похоже на то, что вы пытаетесь выполнить.
Слишком многое нужно исправить, чтобы я мог дать правильный анализ. Вам лучше проверить репозиторий сложных форм . Это рабочий пример accept_nested_attributes_for, он не касается каких-либо отношений HABTM, но должен научить вас всему, что вам нужно знать. Исправленный код ниже составляет 90% от того, что вам нужно. Приведенные выше примеры сложных форм научат вас тому, что вам нужно знать, чтобы заполнить пробелы, которые являются add_association_link и create_association_link.
Исправление включает следующие шаги:
Вы можете сделать это с помощью следующих изменений.
class Attorney < ActiveRecord::Base
has_many :attorney_associations
has_many :associations, :through => :attorney_associations
accepts_nested_attributes_for :attorney_associations, :reject_if => proc { |a|
a['association_id'].blank? }
accepts_nested_attributes_for :associations, :reject_if => proc {|a|
a['name'].blank?}
end
class AttorneyAssociations < ActiveRecord::Base
belongs_to :attorney
belongs_to :association
end
Контроллер поверенного:
def new
@attorney = Attorney.new
@attorney.associations.build
@attorney.attorney_associations.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @attorney }
end
end
Новый вид поверенного:
<% form_for(@attorney, :html => {:multipart => true}) do |f| %>
<%= f.error_messages %>
<%= f.label :"First name" %>
<%= f.text_field :firstname %><br>
<%= f.label :"Last Name" %>
<%= f.text_field :lastname %><br>
<%= f.label :"Attorney Type" %>
<%= f.collection_select :member_type_id, MemberType.all, :id, :name %><br>
<%= f.text_area :bio, :cols => 70, :rows => 20 %><br><br>
<%= f.label :"Attorney Location" %>
<%= f.collection_select :office_location_id, OfficeLocation.all, :id, :location %><br>
<div id="associations">
<% f.fields_for :attorney_association do |aa_form| %>
<%= render :partial => 'attorney_association', :locals => {:f => aa_form} %>
<% end %>
<%= add_association_link "Add Another Existing Association" %>
<% f.fields_for :associations do |assoc_form| %>
<%= render :partial => 'attorney', :locals => {:f => assoc_form} %>
<%= create_association_link, "Create a New Association for this Attorney" %>
</div>
<%= f.submit 'Create' %>
<% end %>
I ' m предполагая, что add_association_link является помощником javascript, который создает ссылку для клонирования пустого экземпляра того, что было партиалом членства. create_association_link - это заполнитель для аналогичного помощника, который добавит частичное для новой ассоциации.
Частичная ассоциация юриста:
<div class="attorney_association">
<%= f.collection_select(:association_id, Association.find(:all),
:id, :name, :include_blank => true) %>
<%= link_to_function "remove", "$(this).up('.attorney_association').remove()" %>
</div>
Частичная ассоциация:
<div class="association">
<%= f.label_for :name %>
<%= f.text_field :name %>
<%= link_to_function "remove", "$(this).up('.attorney_association').remove()" %>
</div>