bentuk bersarang memiliki banyak melalui Rails4

Saya tidak mendapatkan hasil yang diharapkan, Keterampilan tidak terselamatkan. Saya ingin mengizinkan setiap orang untuk mengatakan keterampilan utama HANYA 1.

DB

  # Table name: people
  #
  #  id          :integer          not null, primary key
  #  first_name  :string(255)
  #  last_name   :string(255)
  #  headline    :string(255)
  #  description :string(255)
  #  user_id     :integer
  #  created_at  :datetime
  #  updated_at  :datetime
  #

  # == Schema Information
  #
  # Table name: skills
  #
  #  id          :integer          not null, primary key
  #  title       :string(255)
  #  description :text
  #  created_at  :datetime
  #  updated_at  :datetime
  #

  # == Schema Information
  #
  # Table name: entity_skills
  #
  #  id          :integer          not null, primary key
  #  skill_id    :integer
  #  person_id   :integer
  #  created_at  :datetime
  #  updated_at  :datetime
  #

Model

class Person < ActiveRecord::Base
  has_many :entity_skills
  has_many :skills, through: :entity_skills, foreign_key: "person_id"
  accepts_nested_attributes_for :skills
end


class Skill < ActiveRecord::Base
 has_many :entity_skills
 has_many :people, through: :entity_skills, foreign_key: "person_id"
end

class EntitySkill < ActiveRecord::Base
  belongs_to :person
  belongs_to :skill
end

Pengendali

def new
  @person = Person.new
  @all_skills = Skill.all
  @entity_skills = @person.skills.build

end

def edit
  @all_skills = Skill.all

  @entity_skills = @person.entity_skills.build
end

def create
  @person = Person.new(person_params)

  respond_to do |format|
    if @person.save
      format.html { redirect_to @person, notice: 'Person was successfully created.' }
      format.json { render action: 'show', status: :created, location: @person }
    else
      format.html { render action: 'new' }
      format.json { render json: @person.errors, status: :unprocessable_entity }
    end
  end
end

 def person_params
  params.require(:person).permit(:first_name, :last_name, :headline, :description, :user_id, :employer_id, skills_attributes: [:id])
end

Membentuk

<%= form_for(@person) do |f| %>
  ....
  ....
  <h2>Skills</h2>
    <%= f.fields_for @entity_skills do |es| %>
        <%= es.label "All Skills" %>
        <%= collection_select(:skills, :id, @all_skills, :id, :title) %>
    <% end %>

   <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Tidak ada yang disimpan untuk keterampilan, Dapatkah seseorang menjelaskan apa yang terjadi?


person user1320651    schedule 16.09.2013    source sumber
comment
Periksa parameter yang tidak diizinkan di rails s log keluaran   -  person Oleg Haidul    schedule 16.09.2013
comment
semua diterima, saya mencoba cara di atas dan cara asli saya memposting untuk parameter yang diizinkan - keduanya berakhir sama, tidak ada sql yang dieksekusi selain Person sql   -  person user1320651    schedule 16.09.2013


Jawaban (2)


DB

  # == Schema Information
  #
  # Table name: entity_skills
  #
  #  id          :integer          not null, primary key
  #  skill_id    :integer
  #  person_id   :integer
  #  created_at  :datetime
  #  updated_at  :datetime
  #  position    :integer
  #

Pengendali

  def new
    @person = Person.new
    @all_skills = Skill.all
    5.times {@person.entity_skills.build}
  end

  def create
    @person = Person.new(person_params)
    respond_to do |format|
      if @person.save

        format.html { redirect_to @person, notice: 'Person was successfully created.' }
        format.json { render action: 'show', status: :created, location: @person }
      else
        format.html { render action: 'new' }
        format.json { render json: @person.errors, status: :unprocessable_entity }
      end
    end
  end

    def person_params
       params.require(:person).permit(:first_name, :last_name, :headline, :description, :user_id, :employer_id,  :entity_skills_attributes  => [:skill_id, :position, :person_id, :id])
    end

Membentuk

  <h2>Skills</h2>
  <% i=0 %>
  <%= f.fields_for :entity_skills do |builder| %>
    <% i+=1 %>
    <%= render 'shared/skills_fields', :f => builder, :i=> i %>
  <% end %>

dibagikan/skills_fields

   <div class="field">
   <%= f.label "All Skills" %>

   <%= f.collection_select(:skill_id, Skill.all, :id, :title) %>
     <%= f.hidden_field :position, :value=>i %>
     <%= f.hidden_field :person_id, :value=>@person.id %>
  </div>

Saya memiliki beberapa hal yang funky, param diterima tetapi tidak ditetapkan dengan benar ke formulir, juga membuat kesalahan dengan menggunakan :skills dalam params yang diizinkan alih-alih :entity_skills_attributes => [:skill_id, :position]

Untuk bekerja dengan pembaruan, yang harus saya lakukan hanyalah

 def edit
   @entity_skills=  @person.entity_skills
 end

Saya akan menggunakan posisi ini untuk menyusun ulang keterampilan jika ada yang bertanya-tanya ;-)

Akhirnya terpecahkan

person user1320651    schedule 16.09.2013

Anda tidak dapat menyimpan has_many tanpa membuat catatan gabungan.

Mungkin periksa tutorial oleh Dave Shepard yang membahas hal-hal yang perlu Anda lakukan dengan contoh lengkap.

person Andrew Hacking    schedule 16.09.2013
comment
Solusi saya di atas berhasil, terima kasih atas tipnya, saya sudah menggunakan kode di atas dan tidak apa-apa. - person user1320651; 16.09.2013