2017-11-04 5 views
0

これは私を狂ってしまいます。おそらく私は明らかに何かを見落としているでしょうが、私は同じ話題の他の投稿をすべて読んだので問題を解決することはできません。助けを前にありがとう。入れ子になったフォームは、form_withとfields_forを使って動作しません。

私はモデルKlasseとモデルKlpを持っています。 klasse has many klpsのインスタンス。 klasseと同じ形式でklpを作成したいと思います。私はこれをform_withfields_forを使って設定しました。klasses_controller.rbには3.times { @klasse.klps.build }がありますが、この繰り返しはうまくいかないようです。 fields_forブロックは3回ではなく1回表示されます。

new.htmlのフォームは、「スタートガイド」のガイドと「フォームヘルパー」ガイドの後のfields_forブロックの後に作成されました。

アプリの\モデル\ klasse.rb:

class Klasse < ApplicationRecord 
    has_many :klps 
    has_many :people, :through => :klps 
    accepts_nested_attributes_for :klps, allow_destroy: true, :reject_if => :all_blank 

    validates :name, presence: true, 
        length: { minimum: 1 }, 
        uniqueness: true 

    validates :klp_std_soll, presence: true, 
        length: { minimum: 1 } 

    def klp_std_ist 
     self.klps.sum("std") 
    end 

end 

アプリの\モデル\ person.rb

class Person < ApplicationRecord 
    has_many :klps 
    has_many :klasses, :through => :klps 

    validates :name, presence: true, 
        length: { minimum: 1 }, 
        uniqueness: true 
    validates :vorname, presence: true, 
        length: { minimum: 1 } 

    def last_and_first_name 
    "#{name}, #{vorname}" 
    end 

end 

アプリの\モデルここ

は私のコードです\ klp.rb

class Klp < ApplicationRecord 
    belongs_to :klasse 
    belongs_to :person 
end 

アプリの\コントローラ\ klasses_controller.rb

class KlassesController < ApplicationController 

    def new 
     @klasse = Klasse.new 
     3.times { @klasse.klps.build } 
    end 

    private 
    def klasse_params 
     params.require(:klasse).permit(:name, :klassentyp_id, :klp_std_soll, klps_attributes: [:id, :person_id, :std, :_destroy]) 
    end 

end 

アプリの\コントローラ\ klps_controller.rb

class KlpsController < ApplicationController 

    def new 
     @klp = Klp.new 
    end 

    private 
    def klp_params 
     params.require(:klp).permit(:klasse_id, :person_id, :std) 
    end 
end 

アプリ\ビュー\ klasses \ new.html.erb

<%= form_with scope: :klasse, url: klasses_path, local: true do |form| %> 

    <ul> 
     <%= form.fields_for :klps do |klps_form| %> 
      <p> 
       <%= klps_form.label :person %> 
       <%= klps_form.collection_select :person_id, Person.all, :id, :last_and_first_name %> 
       <%= klps_form.label :std %> 
       <%= klps_form.text_field :std %> 
      </p> 

     <% end %> 
    </ul> 

    <p> 
     <%= form.submit %> 
    </p> 
<% end %> 
+0

質問がわかりません。 'form.fields_for'ブロックの3回の反復を作成しようとしていますか? –

+0

@TomAranda:はい。これらの入力フィールドの3つのセットが必要です。 – JRinCH

+0

class Person :klps endご確認くださいperson.rb –

答えて

1

はあなたが明示的に "レコードオブジェクト" として渡すことができ、インスタンス変数にklpsのあなたのコレクションを設定してみてくださいfields_forメソッドの引数:

アプリケーション/コントローラ/ klasses_controller.rb

def new 
    @klasse = Klasse.new 
    @klps = 3.times { @klasse.klps.build } 
end 

アプリの\ビュー\ klasses \

<%= form.fields_for :klps, @klps do |klps_form| %> 
    ... your form... 
<% end %> 

も参照してくださいnew.html.erb:How do I pass an array to fields_for in Rails?

参考:https://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

+0

ねえ、これはうまくいきます!どうもありがとう! – JRinCH

0

私は

customer.rb

class Customer < ApplicationRecord 
    has_many :addresses, dependent: :destroy 
    accepts_nested_attributes_for :addresses, allow_destroy: true 
end 

address.rb

class Address < ApplicationRecord 
    belongs_to :customer 
end 

customers_controller.rb

class CustomersController < ApplicationController 
    def new 
    @customer = Customer.new 
    3.times { 
     @customer.addresses.build //You can use @customer.addresses.new 
    } 
    end 
end 

    def customer_params 
    params.require(:customer).permit(:id, :name, addresses_attributes:[:id,:country, :state]) 
    end 

new.html.haml

を参照してください例を与えています
= simple_form_for @customer do |f| 
    = f.input :name, label: false, wrapper: false, input_html: { class: "gui-input"}, placeholder: "Customer Name" 
    = f.fields_for :addresses do |a| 
    = render 'addresses/fields', a: a 

view/addresses/_fields.html。HAML

= a.input :country, as: :select, label:false, :wrapper => false, prompt: "Select country" 

= a.input :city, label:false, :wrapper => false, input_html: {class: "gui-input", maxlength: 80, minlength: 2}, placeholder: "City" 

詳細は

https://www.pluralsight.com/guides/ruby-ruby-on-rails/ruby-on-rails-nested-attributes

+0

ありがとうございます。 .buildの代わりに@ customer.addresses.newを使用しても違いはありません。これ以外の私のコードとの唯一の違いは、form_withの代わりにform_for(またはsimple_form_for)を使用していることです。 form_forの代わりにform_forを使用しても役に立ちません。 – JRinCH

+0

@JRinCHあなたは関連でいくつか間違いを犯しました。あなたは団結 –

+0

によって私はhas_manyを確認してくださいPlsは元の投稿を見て、そこにperson.rbを追加しました。 – JRinCH

0

使用

<%= form.fields_for :klps_attributes do |klps_form| %> 
+0

'form_with'の代わりに' form_for'を試してみることもできます。 – Gabbar

+0

ありがとうございます。 klps_attributesの代わりに:klpsを使用しても違いはありません。また、form_forの代わりにform_forを使用しても役に立ちません。私は明白な何かを見落としていますか? – JRinCH

関連する問題