Formulir bersarang Rails 4 tidak membuat objek yang diterima_nested_attributes_for

Saya mencoba membuat kategori dan subkategori berfungsi. Sejauh ini, saya dapat membuat kategori dan menambahkan subkategori ke dalamnya. Saat saya mengirimkan formulir, subkategori_atribut terkirim, tetapi tidak ada catatan Subkategori yang dibuat. Tolong bantu, saya mencabut rambut saya di sini, dan sepertinya tidak ada tutorial yang membantu.

kategori.rb

class Category < ActiveRecord::Base
   has_many :subcategories, :dependent => :destroy
   accepts_nested_attributes_for :subcategories, :reject_if => lambda {|a| 
   a[:content].blank?}
end

subkategori.rb

class Subcategory < ActiveRecord::Base
   belongs_to :category
end

categories_controller.rb

class CategoriesController < ApplicationController
   before_action :set_category, only: [:show, :edit, :update, :destroy]

def index
   @categories = Category.all
end

def show
end

def new
   @category = Category.new
   @category.subcategories.build
end

def edit
end

def create
   @category = Category.new(category_params)

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

def update
   respond_to do |format|
     if @category.update(category_params)
       format.html { redirect_to @category, notice: 'Category was successfully 
       updated.' }
       format.json { head :no_content }
     else
       format.html { render action: 'edit' }
       format.json { render json: @category.errors, status: :unprocessable_entity }
     end
   end
end

def destroy
   @category.destroy
   respond_to do |format|
     format.html { redirect_to categories_url }
     format.json { head :no_content }
   end
end

private
# Use callbacks to share common setup or constraints between actions.
  def set_category
    @category = Category.find(params[:id])
  end

# Never trust parameters from the scary internet, only allow the white list through.
  def category_params
    params.require(:category).permit(:name, subcategories_attributes: [:id, :name, 
    :_destroy])
  end
end

_form.html.erb

<%= nested_form_for(@category) do |f| %>
  <% if @category.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@category.errors.count, "error") %> prohibited this category 
      from being saved:</h2>   
      <ul>
      <% @category.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <%f.fields_for :subcategories do |builder|%>
    <p>
      <b>Subcategory</b>
      <%=builder.text_field :name%>
      <%=builder.link_to_remove "Remove"%>
    <p>
  <%end%>
    <p>
      <%=f.link_to_add "Add a Subcategory", :subcategories%>
    </p>    

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

Params Hash (saat dikirimkan):

  Parameters: {"utf8"=>"✓", 
  "authenticity_token"=>"19FxRnWF1F3BD4QZIkkce4arkOPt/BMkWFw6Z+vpV+8=", "category"=>
  {"name"=>"Test", "subcategories_attributes"=>{"1398706662184"=>{"name"=>"TS1", 
  "_destroy"=>"false"}, "1398706664804"=>{"name"=>"TS2", "_destroy"=>"false"}}}, 
  "commit"=>"Create Category"} 

Terima kasih sebelumnya!


person DaveahamLincoln    schedule 28.04.2014    source sumber


Jawaban (1)


subcategories_attributes dikirim dengan benar dalam hash params Anda, TETAPI atribut content tidak ada di dalamnya.

"subcategories_attributes"=>{"1398706662184"=>{"name"=>"TS1", 
  "_destroy"=>"false"}, "1398706664804"=>{"name"=>"TS2", "_destroy"=>"false"}}

Perhatikan tidak ada kunci content yang diteruskan. Jadi, semua catatan subkategori yang diteruskan dalam subcategories_attributes DITOLAK karena kondisi yang Anda tentukan dalam model Category:

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

Perhatikan :reject_if => lambda {|a| a[:content].blank?} bagian di atas, ini akan menolak semua catatan yang content hilang.

PEMBARUAN

saat saya melakukan tindakan edit, bidang tersebut tidak muncul, meskipun telah ditambahkan ke database sebagaimana mestinya (dan muncul seperti itu di formulir lain).

Tetapkan variabel dalam tindakan edit dan new seperti di bawah ini:

def new
 @category = Category.new
 @subcategories = @category.subcategories.build ## Added
end

def edit
  @subcategories = @category.subcategories  ## Added
end

Perbarui fields_for dalam formulir edit seperti di bawah ini:

<%= f.fields_for :subcategories, @subcategories do |builder|%>
person Kirti Thorat    schedule 28.04.2014
comment
Jadi haruskah saya menggunakan lambda {|a| a[:name].blank?} saja? Saya cukup baru mengenal lambdas, tidak yakin apakah :content merupakan simbol bawaan untuk hal-hal di sini. - person DaveahamLincoln; 29.04.2014
comment
Ya kamu bisa. Ini hanya pemeriksaan pada atribut lain. Saat Anda meneruskan bidang :name untuk subkategori di subcategories_attributes, ini akan menyelesaikan masalah Anda. subcategories akan berhasil disimpan. - person Kirti Thorat; 29.04.2014
comment
Itu memperbaikinya! Terima kasih! - person DaveahamLincoln; 01.05.2014
comment
Satu pertanyaan lain- ketika saya pergi ke tindakan edit, bidang tidak muncul, meskipun telah ditambahkan ke database sebagaimana dimaksud (dan muncul seperti itu di formulir lain). Saya ingin menghapus subkategori jika perlu dari tindakan edit. Maaf jika aku merepotkan... - person DaveahamLincoln; 01.05.2014
comment
Lihat bagian UPDATE di jawabannya. - person Kirti Thorat; 01.05.2014
comment
EDIT Saya salah, kodenya masih tidak berfungsi. Ia mengembalikan kesalahan metode `model_name' for #‹Class:0x000000053b6410› yang tidak ditentukan pada tindakan edit, menunjuk ke baris ‹%f.fields_for @subcategories, :subcategories do |builder|%›. - person DaveahamLincoln; 02.05.2014
comment
Periksa jawaban fields_for yang diperbarui. Juga = tidak ada di <%= fields_for .....%> , Anda memerlukannya untuk menampilkan keluaran fields_for dalam tampilan. - person Kirti Thorat; 02.05.2014
comment
Tanda sama dengan itu memperbaiki segalanya! Tangkapan bagus! Sangat menghargai bantuannya! - person DaveahamLincoln; 03.05.2014
comment
Tidak masalah. Senang untuk membantu:) - person Kirti Thorat; 03.05.2014