2013-07-04 3 views
0

EDIT - исправлено: Проблема заключалась в том, что хэш параметров и рассмотрев много вопросов о SO, я придумал следующее решение, которое (пока) работает хорошо:с использованием кокона для создания вложенных моделей детей

Действие student_groups#new теперь выглядит так: может быть, есть лучший способ проанализировать параметры, но ... это работает!

def create 
@student_group = @user.student_groups.build(params[:student_group]) 
### https://stackoverflow.com/questions/2610263/how-to-access-nested-params 
@params = params[:student_group][:students_attributes] 
if @student_group.save 
    ### https://stackoverflow.com/questions/14502508/undefined-method-for-nilnilclass-when-pushing-values-to-an-array 
    if @params.present? 
    @params.values.each do |student| 
     @student_group.students.create(name:"#{student[:name]}", gender: "#{student[:gender]}") 
    end 
    end  
    # new subject path 
    redirect_to class_path(@student_group), flash: { success: "#{@student_group.name} has been added successfully" } 
else 
    @title = "Create a new group" 
    flash.now[:error] = "Something's gone wrong. Please try again!" 
    render 'new' 
end 

конец

student_group.rb: Я должен был отметить :_destroy в attr_accessor

class StudentGroup < ActiveRecord::Base 
    ### https://github.com/ryanb/nested_form/issues/222 
    attr_accessor :_destroy 
    attr_accessible :name, :number_of_students, :type_of_group, :students_attributes 

    belongs_to :user 
    has_one :age, dependent: :destroy 
    has_many :students, dependent: :destroy 

    accepts_nested_attributes_for :students, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 

    ... 

end 

и _groups_form.html.erb: Добавлена ​​CHILD_INDEX согласно this

<%= form_for @student_group do |f| %> 

<p> 
    The name of this group is 
    <span class="field form_field"><%= f.text_field :name %></span> 
    and it is a/an 
    <span class="field dropdown"><%= f.select :type_of_group, [["select a group type", ""], "young learners class (0-6)", "primary class (7-12)", "secondary class (13-17)", "adult class (18+)", "children's sport team", "adult's sport team"] %></span> 
    <!-- <span id="nos" class="field dropdown"><%#= f.select :number_of_students, (0..60) %></span> --> 
    </p> 


    <table id="nos_header"> 
    <thead> 
     <tr> 
     <th>Student name:</th> 
     <th>Gender:</th> 
     </tr> 
    </thead> 
    <tbody> 
     <!-- https://stackoverflow.com/questions/11445831/how-to-submit-multiple-new-items-via-rails-3-2-mass-assignment -->  
     <%= f.fields_for :students, @student, child_index: @student do |builder| %> 
      <%= render "student_fields", :f => builder %> 
     <% end %> 
     <tr> 
      <td class="links"><%= link_to_add_association 'add student', f, :students %></td> 
     </tr> 
    </tbody> 
    </table> 

<%= f.submit "Submit", :class => 'big_button round unselectable'%> 

<% end %> 

E ND EDIT

Я использую rails 3.2.13 и cocoon, чтобы сделать вложенную форму в моей модели student_group. Форматирование по-прежнему немного отвратительно, и я хотел бы реализовать coffeescript для автоматического обновления правильного количества студентов, но это то, что я могу выяснить позже. На данный момент основная проблема заключается в том, что, пока формы появляются и могут быть заполнены/представлены без ошибок, новые модели детей не создаются.

вот _form парциальное

<%= form_for @student_group do |f| %> 

    <p> 
    The name of this group is 
    <span class="field form_field"><%= f.text_field :name %></span> 
    and it is a/an 
    <span class="field dropdown"><%= f.select :type_of_group, [["select a group type", ""], "young learners class (0-6)", "primary class (7-12)", "secondary class (13-17)", "adult class (18+)", "children's sport team", "adult's sport team"] %></span> 
    <!-- <span id="nos" class="field dropdown"><%#= f.select :number_of_students, (0..60) %></span> --> 
    </p> 


    <table id="nos_header"> 
    <thead> 
    <tr> 
     <th>Student name:</th> 
     <th>Gender:</th> 
    </tr> 
    </thead> 
    <tbody>  
    <%= f.fields_for :students do |builder| %> 
     <%= render "student_fields", :f => builder %> 
    <% end %> 
    <td class="links"><%= link_to_add_association 'add student', f, :students %></td> 
    </tbody> 
</table> 

<%= f.submit "Submit", :class => 'big_button round unselectable'%> 

<% end %> 

и _student_fields парциальное:

<tr class="nested-fields"> 
    <td class="field form_field"><%= f.text_field :name %></td> 
    <td class="field dropdown"><%= f.select :gender, [["select a gender", ""],'Female', 'Male', 'Transgender'] %></td> 
    <td><%= link_to_remove_association "remove student", f %></td> 
</tr> 

Когда я делаю новую группу в браузере, новые студенты не создаются, и я могу видеть это в сервер:

Started POST "/student_groups" for 127.0.0.1 at 2013-07-04 14:58:51 +0200 
Processing by StudentGroupsController#create as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"u/DbVbgMKoT6kWPBKsD0sVNBLVRpFY87E5nZQWK+K9o=", "student_group"=>{"name"=>"test", "type_of_group"=>"young learners class (0-6)", "students_attributes"=>{"1372943007652"=>{"name"=>"Johnny Test", "gender"=>"Male", "_destroy"=>""}, "1372943009403"=>{"name"=>"Quizzy", "gender"=>"Transgender", "_destroy"=>""}}}, "commit"=>"Submit"} 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 56 LIMIT 1 
(0.1ms) begin transaction 
SQL (0.6ms) INSERT INTO "student_groups" ("created_at", "name", "number_of_students", "type_of_group", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?) [["created_at", Thu, 04 Jul 2013 12:58:51 UTC +00:00], ["name", "Test"], ["number_of_students", nil], ["type_of_group", "adult class (18+)"], ["updated_at", Thu, 04 Jul 2013 12:58:51 UTC +00:00], ["user_id", 56]] 
(2.4ms) commit transaction 
Redirected to http://localhost:3000/class/407 
Completed 302 Found in 8ms (ActiveRecord: 3.3ms) 

Это хэш, который как представляется, вопрос -

"students_attributes"=>{"1372943007652"=>{"name"=>"Johnny Test", "gender"=>"Male", "_destroy"=>""}, "1372943009403"=>{"name"=>"Quizzy", "gender"=>"Transgender", "_destroy"=>""}} 

где должны эти студенческие атрибуты идут/как я должен иметь дело с ними так, что они создают новый студент (ы)? Благодаря!

+0

Вы также можете изучить 'accepts_nested_attributes_for', который будет обрабатывать параметры' students_attributes' для вас. [ссылка] (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) – spullen

+0

ах, на самом деле у меня это в моем s_g.rb, это было частью «...» - i ' Редактируем это, хотя, поскольку это важно – dax

ответ

0

См. Редактирование в начале оригинального сообщения для получения более подробной информации о решении. Ответ на этот вопрос закрыт.

Смежные вопросы