0

私は 'accepts_nested_attributes'の逆をしています。私は 'children_controller#create'から親インスタンスを作成したいと思います。たぶんあなたはいくつかのアドバイスをするか、そうすることは関係ないと私に説明します。私はすべてのコメントに開いています!Rails - 子フォームから親インスタンスを作成する

私はクライアントモデルがあります:私は反応するレールを宝石を使用していますし、/magazinesに私は新しい雑誌を作成するためのフォームを持っている

class Magazine < ActiveRecord::Base 
    belongs_to :client 
    validates :client, :launch_date, presence: true 
    # accepts_nested_attributes_for :client 
end 

class Client < ActiveRecord::Base 
    has_one :magazine 
    validates :name, presence: true, uniqueness: true 
end 

や雑誌のモデルをクライアント名を与えるためのテキストフィールド。

PG::ForeignKeyViolation - ERROR: insert or update on table "magazines" violates foreign key constraint "fk_rails_cd907cfe6d" 
DETAIL: Key (client_id)=(51) is not present in table "clients". 

クライアントがデータベースに保存されていなかったかのように:私のmagazines_controller.rb

は、私はいつもPG ::エラーになってしまい、次の

def create 
    @client = Client.find_by_name(magazine_params[:client_id]) 
    @selected_magazine = Magazine.new(magazine_params) 
    authorize @selected_magazine 
    if @client 
    @selected_magazine.client = @client 
    else 
    @client = Client.new(name: magazine_params[:client_id]) 
    @client.save 
    @selected_magazine.client = @client 
    end 
    # @client = Client.where(name: magazine_params[:client_id]).first_or_create 
    # @selected_magazine.client = @client if @selected_magazine.client_id.to_i == 0 
    @title = magazine_params[:title] 
    @selected_issue = nil 
    @issues = nil 
    @selected_magazine.save 
    binding.pry 
    @magazines = policy_scope(Magazine) 
end 

def magazine_params 
    magazine_params = params.require(:magazine).permit(:title, :analytics_id, :launch_date, :client_id) 
    # if @client 
    # params[:magazine][:client_id] = @client.id 
    # magazine_params.merge!(params[:magazine]) 
    # end 
    return magazine_params 
end 

を置きます。私がbinding.pryになり、Client.allafter @client.saveと呼ぶと、私の新しいクライアントは返されません。

他のプロジェクトでも同様の問題があったので、うまくいきましたので少し驚きました。あなたの情報のために:

# Previous Project 
# Gemfile.lock 
pg (0.18.3) 
rails (4.2.0) 

#Current Project 
# Gemfile.lock 
pg (0.18.4) 
rails (4.2.5.1) 

あなたの助けを前もってありがとう。 children_controllerの子の前に親インスタンスを作成するためのアドバイスがあれば、本当に興味があります。

PS1:コントローラでは、最初にコメントを付けてみましたが、作成すると出力は変わりません。 PS2:Gemfileに関する詳細情報が必要な場合は教えてください。

+0

実際の実装についてこれを参照できますかネストされた属性を受け入れることのできるイオン。 https://www.sitepoint.com/complex-rails-forms-with-nested-attributes/ –

+0

まず、 'Client'のインスタンスを取得し、古い構文' Clientを使用しないでください。 'Client.where(名前:magazine_params [:client_id])。最初! ' 第2に、' Client'インスタンスが保存されていることを確認してから ' @ client.save! 'と入力します。 – BitOfUniverse

+0

@VaibhavDhoke、私は親から子になるネストされた属性の逆をしようとしている[リンク(http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)。私があなたの例を挙げるなら、1対1の関連付けをしてアドレス帳からユーザーを作成したいと思います。 – MaxDpt

答えて

1

あなたは、たとえば、あなたの団体のinverse_ofを試してみたいことがあります。

class Client < ActiveRecord::Base 
    has_one :magazine, inverse_of: :client 
    validates :name, presence: true, uniqueness: true 
end 

class Magazine < ActiveRecord::Base 
    belongs_to :client, inverse_of: magazine 
    validates :client, :launch_date, presence: true 
    # accepts_nested_attributes_for :client 
end 
深い読みが

http://guides.rubyonrails.org/association_basics.html#bi-directional-associations

一般的なユースケースは、しかし、ですhas_many

0

下記のコードを試してください。これで問題は解決します。問題は、クライアントを保存する前に雑誌を保存しようとしていることだと思います。また、@ client.validを確認する必要がありますか?が真でない場合は、@ client.errorsをチェックしてください。また、コントローラを次のように書き換えます。

def create 
    @client = Client.find_by_name(params[:magazine][:client_id]) 

    if @client.nil? 
    @client = Client.new(name: params[:magazine][:client_id]) 
    end 

    @selected_magazine = @client.magazines.new(magazine_params) 

    authorize @selected_magazine 

    @title = magazine_params[:title] 
    @selected_issue = nil 
    @issues = nil 

    @client.save 
    @magazines = policy_scope(Magazine) 
end 

def magazine_params 
    params.require(:magazine).permit(:title, :analytics_id, :launch_date) 
end 
+0

クライアントとmagの関係は' has_one <=> belongs_to'so ' @selected_magazine = @ client.magazines.new(magazine_params) 'はエラーを発生させます。私は2つの行に分割し、singulareを使用すると、有効なクライアントと無効なマガジン(no client_id)を取得します。私は 'PG :: ForeignKeyViolation - ERROR:テーブルの更新または削除を取得します。"クライアント "はテーブル"雑誌 "の外部キー制約" fk_rails_cd907cfe6d "に違反します。 DETAIL:キー(id)=(55)はまだテーブル"雑誌 "から参照されます。 ' – MaxDpt

0

http://www.amooma.de/screencasts/2015-01-22-nested_forms-rails-4.2/を参照してください。例で説明します。あなたの問題を解決するかもしれません。

+0

私がaccepts_nested_attributesを読んだことは、親から子にしかなりません。逆ではありません(http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html)、そうでしょうか? – MaxDpt

+0

それは私の理解でもありますが、私はなぜそれが当てはまるのか分かりません。新しい子フォームを使用して子を作成するときに、親を作成する(または既存の親を選択する)場合があります。 accepts_nested_attributesを使用する代わりに、これを達成するためのより良い方法がありますか?どうも – BB500

関連する問題