0

繭のテーブルとテーブルで1レベルのネストされたフォームを正常に実装しました。しかし、私は別のネストされたレベルを行う方法に私の心をラップするのは難しい時を過ごしています。私の問題は、テーブルでこれを行う方法です。そして、テーブルはまったく行く書き込み方法ではないかもしれません。初心者を助けてくれてありがとう。ここで繭とテーブルを含む複数レベルのネストされたフォーム

私のモデルです:

class Profession < ApplicationRecord 
    has_many :procedure_categories, dependent: :destroy 
    accepts_nested_attributes_for :procedure_categories, allow_destroy: true 
end 

そして:

class ProcedureCategory < ApplicationRecord 
    belongs_to :profession 
    has_many :procedures 

    accepts_nested_attributes_for :procedures, allow_destroy: true 
end 

そして:ここ

class Procedure < ApplicationRecord 
    belongs_to :procedure_category 
end 

は私のトップレベルのフォームコードです:

<%= form_for(@profession) do |f| %> 
    <%= render 'shared/profession_error_messages' %> 

    <%= f.label :profession %> 
    <%= f.text_field :profession, class: 'form-control' %> 

    <%= f.label :description %> 
    <%= f.text_field :description, class: 'form-control' %> 

    <%= f.label :active, class: "checkbox inline" do %> 
    <%= f.check_box :active %> 
    <span>Active profession?</span> 
    <% end %> 

    <table class='table'> 
    <thead> 
     <tr> 
     <th>Category</th> 
     <th>Description</th> 
     <th>Display Order</th> 
     <th>Selection Type</th> 
     <th>Delete</th> 
     <th>Edit</th> 
     </tr> 
    </thead> 
    <tbody class="categories"> 
     <%= f.fields_for :procedure_categories do |procedure_category| %> 
     <%= render 'procedure_category_fields', f: procedure_category %> 
     <% end %> 
    </tbody> 
    </table> 


    <%= link_to_add_association 'Add Category', f, :procedure_categories, 
    data: { association_insertion_node: '.categories', association_insertion_method: :append } %> 

    <br><br>  
    <%= f.submit "Save", class: "btn btn-primary" %> 
    <% end %> 

そして次の部分1レベル下:だから

<tr class="nested-fields"> 
    <td><%= f.text_field :category, class: 'form-control' %></td> 
    <td><%= f.text_field :description, class: 'form-control' %></td> 
    <td><%= f.text_field :display_order, class: 'form-control' %></td> 
    <% cs = options_for_select(controls, f.object.selection_type) %> 
    <td><%= f.select :selection_type, cs, class: 'form-control' %></td> 
    <td><%= link_to_remove_association "Remove Category", f %></td> 
    <% if f.object != nil %> 
    <td><%= link_to "Category", edit_procedure_category_path(@profession,f.object) %><td></td> 
    <% end %> 
</tr> 

、私は(手続き)をネストの最終レベルを実装する方法に苦しみました。

ありがとうございます。

class Profession < ApplicationRecord 
    has_many :procedures, through: categories 
    has_many :categories, dependent: :destroy 
    accepts_nested_attributes_for :categories, allow_destroy: true 
end 

category

class Category < ApplicationRecord 
    belongs_to :profession 
    has_many :procedures 

    accepts_nested_attributes_for :procedures, allow_destroy: true 
end 

にこのprocedure_categoryモデルの名前を変更し、::ここで使用has_many :through

+0

読む詳細を確認しました、多分それは役立ちます:あなたの詳細な回答のためhttps://github.com/nathanvda/cocoon_simple_form_demo – nathanvda

答えて

0

は私のモデルです

class Procedure < ApplicationRecord 
    belongs_to :category 
end 

私が何かを逃した場合、あなたは彼らがビューで使用できるように、コントローラprofessions#newアクションは、以下の変数を作成する必要がありinstruction from the rails guide

確認することができます。

def new 
    @profession = Profession.new 
    @categories = @profession.categories.build 
    @procedures = @categories.procedures.build 
end 

ビューはそう、その変数を使用しますユーザー入力を保存し、parametersハッシュに格納されたこれらの入力を用いて、の/profession/の要求を

に格納します

fields_forはフォームビルダを生成します。パラメータの名前は、accepts_nested_attributes_forが予期するものになります。2つのアドレスを持つユーザーを作成する場合たとえば、提出されたパラメータは次のようになりますので、あなたのフォームはpost URLを指していることを確認してください

{ 
    'profession' => { 
    'name' => 'John Doe', 
    'categories_attributes' => { 
     '0' => { 
     'kind' => 'Home', 
     'street' => '221b Baker Street', 
     'procedures_attributes' => { 
     '0' => {}, 
     '1' => {} 
     } 
     }, 
     '1' => { 
     'kind' => 'Office', 
     'street' => '31 Spooner Street' 
     } 
    } 
    } 
} 

これはあなたのparametersはのようになります方法です/professions/とルーティングはbinding pryを設定するいかなる問題についてprofessions#createアクション

def create 
    binding.pry 
end 

をトリガし、あなたにチェックすることあなたのparametersがどのように表示されていますか?あなたは別のネストされた関係とレベルが実証されているデモプロジェクトを http://guides.rubyonrails.org/form_helpers.html#building-complex-forms

+0

おかげで、しかし、私はなぜあなたがを通して使用を述べた理由を理解していない:関係のために。私は多対多の関係を実装しようとしていないんだ。これはどうやって私を助けてくれるの? – Foosaurus

+0

いいえ@ user8711275私は正しいです。あなたは理解できませんでした(申し訳ありません)。 'has_many:through'は多対多の関係ではなく、1対多+ 1対多の関係になります。私のデザインはより良く、私のコードはより良いものになりました。おそらくあなたの答えを読んでから、https://www.youtube.com/watch?v=Cj1FhPy9sz4を見て、http://guides.rubyonrails.org/association_basics.html#the-has-many-through-associationとできるだけ多くの情報を..あなたはすぐにそれを取得します!幸運とポイントは私に動機づけてくれてありがとう –

関連する問題