0

モデルAとモデルBを持ち、リレーションシップはA has_many B(とB belongs_to A)です。モデル、コントローラ、Aのビュー、Bのモデルしかありません。 A(url/a/1/edit)の編集ビューでBのインスタンスを作成して編集したいとします。親モデルのビューにネストされたモデルインスタンス(has_manyリレーション)を作成する

私はBのコントローラを作成して、Aのビューでフォームを使用してこれらのメソッドを呼び出すことができますが、Bの実際のビューを必要としないため、Aのビューにリダイレクトする必要があります。

これを行う推奨方法がありますか?私が望むのは、ヘルパーレールが提供するものを壊さないことです(例えば、フォワードの後、エラーメッセージやそのようなものを得るのは苦痛だと思います)。

ありがとうございます!

+0

ネストされたフォームのためにあなたがここにドキュメントを取得することができます ''宝石「繭」しようとします。https:// githubの.com/nathanvda/cocoon – Mayank

+0

モデルAでコールバックメソッド(before_save/after_save)を使用するだけで、ビューからの入力が不要な場合は、更新されたモデルAを編集メソッドで保存するとコールバックがトリガーされ、そのコールバックで関連するモデルを編集することができます。ネストされたモデルのフィールドをビューから編集する必要がある場合は、@Mayankが参照するgem "cocoon"を使用してください。 –

答えて

0

モデルレベルではaccepts_nested_attributes_forを使用します。

class A < ApplicationModel 
    has_many :bs 
    accepts_nested_attributes_for :bs 
    validates_associated :bs 
end 

class B < ApplicationModel 
    belongs_to :a 
end 

これはテイク属性をすることができますし、属性の配列を持つ属性bs_attributesを渡すことで、ネストされたbsを作成します。 validates_associatedは、Aが永続化できないことを保証するために使用することもでき、bsも有効ではありません。

params.require(:a) 
     .permit(:foo, bs_attributes: [:id, :bar]) 

新しいレコードを作成するときにも、「しなければなりません:子レコードの許可属性の配列とハッシュキーを使用しwhitelist nested attributesfields_for

<%= form_for(@a) do |f| %> 
    # field on A 
    <%= f.text_input :foo %> 
    # creates a fields for each B associated with A. 
    <%= f.fields_for(:bs) do |b| %> 
    <%= b.text_input :bar %> 
    <% end %> 
<% end %> 

nested form fields使用を作成するには

ネストされたレコードを作成するための入力が存在するようにするには、このフォームを「シード」します。

class AsController < ApplicationController 

    def new 
    @a = A.new 
    seed_form 
    end 

    def create 
    @a = A.new(a_params) 
    if @a.save 
     redirect_to @a 
    else 
     seed_form 
     render :new 
    end 
    end 

    def update 
    if @a.update(a_params) 
     redirect_to @a 
    else 
     render :edit 
    end 
    end 

    private 

    def seed_form 
    5.times { @a.bs.new } if @a.bs.none? 
    end 

    def a_params 
    params.require(:a) 
      .permit(:foo, bs_attributes: [:id, :bar]) 
    end 
end 

編集: seed_formは、1つ追加して毎回行うこともできます。だからあなたはいつも "空の"ものを1つ追加します。あなたはそれがaccepts_nested_attributes_forを変更することで満たされていなかった場合は、保存する前に、空の1をフィルタリングすることを確認する必要があります。

accepts_nested_attributes_for :bs, reject_if: proc { |attr| attr['bar'].blank? } 
+0

これは一般的にRailsの最も複雑な部分の1つです。フォローアップの質問をする前に、この答えのドキュメントのリンクをよくお読みください。 – max

+0

そして、あなたは繭の宝石は必要ありません。ネストされたレコードを扱うことの特定の側面を簡単にするだけでなく、多くの重要な知識を抽象化します。 – max

+0

詳細な回答ありがとうございました。私はそれに目を通し、私が質問をフォローアップすれば戻ってくるだろう。 (そして私がそれをしたら答えを正しいとマークしてください。* g *) – LetzFlow

関連する問題