Rails 3.1 has_many: через форму - PullRequest
       0

Rails 3.1 has_many: через форму

1 голос
/ 19 января 2012

У меня есть модели, подобные следующим:

class Dog < ActiveRecord::Base
  validates :registration, :uniqueness => true
  belongs_to :breed
  has_many :shows, :through => :show_entries
  has_many :show_entries
end

class Show < ActiveRecord::Base
  belongs_to :event
  has_many :dogs, :through => :show_entries
  has_many :show_entries
  after_save :update_event
end

class ShowEntry < ActiveRecord::Base
  belongs_to :show
  belongs_to :dog
  belongs_to :entry_class
  #DB has a bunch of other fields
end

Теперь у меня есть форма, которая отображает несколько флажков:

<% for show in @shows %>
    <%= check_box_tag "dog[show_ids][]", show.id, @dog.shows.include?(show), {:id => "dogs_show_"}%>
    <%= show.name %>
<% end %>

Я не могу понять, что делать в действии контроллера POST. Как получить значения и обновить таблицу ShowEntry для создания или удаления?

Спасибо, D.

ОБНОВЛЕНИЕ: я забыл упомянуть, что в таблице ShowEntry также есть другие строковые поля. Как мне представить их в форме и обработать их в действии контроллера POST?

Вот форма, которую я имел в виду (в псевдо-HTML), предполагая, что у меня есть 3 шоу, которые я могу потенциально связать с собакой:

<div>
  check_box for Show1
  dropdownlist for entry_class
  input text for property1
  input text for property2
</div>
<div>
  check_box for Show2
  dropdownlist for entry_class
  input text for property1
  input text for property2
</div>
<div>
  check_box for Show3
  dropdownlist for entry_class
  input text for property1
  input text for property2
</div>

Конечно, он будет красиво оформлен, последние четыре строки в каждой будут скрыты или показаны в зависимости от проверенного статуса каждого флажка.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Если я читаю это право, похоже, вам нужно 'accepts_nested_attributes_for: show_entries' на модели Dog.Затем в форме вам нужно «собака [show_entry] [некое уникальное целое число] [какое-то имя атрибута]» для каждой комбо-записи / записи атрибута.Уникальный int используется для группировки атрибутов вместе.Он не связан с идентификатором модели шоу-записи.

Тогда вы должны иметь возможность сказать «Dog.new params [: dog]» в действии создания, и оно должно автоматически создать записи шоу иассоциации.

ОБНОВЛЕНИЕ: Извините, я был на моем телефоне вчера вечером, поэтому было сложно написать кучу кода.Но основная идея заключается в том, чтобы получить правильно отформатированные данные ShowEntry внутри формы Dog.

<%= form_for @dog do |form| %>
  <%= form.fields_for :show_entries do |se_form| %>
     <%# Build form elements for existing show entries %>  
  <% end %>
  <%# These shows should either be pre-filtered down to the ones not already associated to the dog or you should add that check in the loop below %>
  <% @shows.each do |show| %>
    <%= form.fields_for :show_entries, ShowEntry.new(:show => show, :dog => @dog) do |new_se| %>
      <%# Build form elements for new show entries %>
    <% end %>
  <% end %>
  <%= form.submit %>
<% end %>

Это позволит вам создавать новые записи ShowEntry при обновлении записи Dog.Вы должны быть в состоянии передать params[:dog] непосредственно в update_attributes внутри действия вашего контроллера.

Если вы хотите иметь возможность уничтожать записи шоу, тогда вам нужно добавить :allow_destroy => true к accepts_nested_attributes_forдекларация.Затем, передавая имя с именем :_destroy с истинным значением для конкретного ShowEntry в форме update_attributes, автоматически удалит модель ShowEntry.

Возможно, вы захотите использовать :_destroy в качествескрытое поле со значением true, за которым следует флажок false.Таким образом, когда флажок установлен, запись не будет уничтожена, и новые данные вступят в силу.Если флажок снят, :_destroy будет иметь значение true, и запись будет уничтожена или не сохранена в БД.Вы можете использовать JavaScript для включения и отключения полей формы, связанных с ShowEntry, чтобы пользователи не могли вводить данные, которые не будут сохранены.

1 голос
/ 19 января 2012

Если вы хотите создать ассоциацию между собаками и выставками, то в контроллере.

dog = Dog.find(params[:id])    
dog.show_ids =  params(dog[show_ids]) # where show_ids is the array of show_ids
dog.save #I think this is optional, 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...