0

私はクライアントとオフィスアドレスモデルを持っています。クライアントが作成されたときにオフィスアドレスを作成したいので、ネストされた属性方向に移動することにしました。ネストされた属性を持つフォームがレールを保存していない5

Officeアドレスを使用してクライアントを作成しようとすると、サーバーの出力にこれが表示されますが、続行する方法がわかりません。

Started POST "/clients" for 127.0.0.1 at 2016-10-26 21:57:06 -0600 
Processing by ClientsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"oC4Bwgw8zQrQCGU6RVGXXVwgWGIbOGmyP9gmJYUbyKXVXzgdeRGrp/wMnsmbF6spSeNxTpcHLJx+ZceBKjHxvQ==", "client"=>{"account_id"=>"", "name"=>"Test Client", "client_type"=>"Corp", "client_ident"=>"1234567890", "office_address_attributes"=>{"client_id"=>"", "unit_number"=>"317", "street_number"=>"1717", "street_name"=>"60 st SE", "city"=>"Clagary", "prov_state"=>"Alberta", "postal_zip"=>"T2A7Y7", "country"=>"CA"}}, "commit"=>"Create Client"} 
    Account Load (0.1ms) SELECT "public"."accounts".* FROM "public"."accounts" WHERE "public"."accounts"."subdomain" = $1 LIMIT $2 [["subdomain", "shawnwilson"], ["LIMIT", 1]] 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    (0.1ms) BEGIN 
    (0.1ms) ROLLBACK 
    Rendering clients/new.html.erb within layouts/application 
    Rendered clients/_form.html.erb (32.8ms) 
    Rendered clients/new.html.erb within layouts/application (34.4ms) 
    Rendered shared/_signed_in_nav.html.erb (0.7ms) 
Completed 200 OK in 109ms (Views: 102.0ms | ActiveRecord: 1.2ms) 

クライアントを作成するときにクライアントをアカウントに関連付けると、OfficeAddressをクライアントに関連付ける必要があります。

私のクライアントモデル

class Client < ApplicationRecord 
    belongs_to :account, required: true 
    has_one :office_address 
    validates :office_address, presence: true 
    accepts_nested_attributes_for :office_address 
end 

マイ事務所住所モデル

class OfficeAddress < ApplicationRecord 
    belongs_to :client, required: true 
end 

私のクライアントコントローラ

class ClientsController < ApplicationController 
    before_action :set_client, only: [:show, :edit, :update, :destroy] 

    # GET /clients 
    # GET /clients.json 
    def index 
    @clients = Client.all 
    end 

    # GET /clients/1 
    # GET /clients/1.json 
    def show 
    end 

    # GET /clients/new 
    def new 
    @client = Client.new 
    @client.build_office_address 
    end 

    # GET /clients/1/edit 
    def edit 
    end 

    # POST /clients 
    # POST /clients.json 
    def create 
    @client = Client.new(client_params) 

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

    # PATCH/PUT /clients/1 
    # PATCH/PUT /clients/1.json 
    def update 
    respond_to do |format| 
     if @client.update(client_params) 
     format.html { redirect_to @client, notice: 'Client was successfully updated.' } 
     format.json { render :show, status: :ok, location: @client } 
     else 
     format.html { render :edit } 
     format.json { render json: @client.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /clients/1 
    # DELETE /clients/1.json 
    def destroy 
    @client.destroy 
    respond_to do |format| 
     format.html { redirect_to clients_url, notice: 'Client was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def client_params 
     params.require(:client).permit(:account_id, :name, :client_type, :client_ident, office_address_attributes: [:unit_number, :street_number, :street_name, :city, :prov_state, :postal_zip, :country, :client_id]) 
    end 
end 

マイフォーム

<%= simple_form_for(@client) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :account_id %> 
    <%= f.input :name %> 
    <%= f.input :client_type %> 
    <%= f.input :client_ident %> 
    </div> 

    <%= f.fields_for :office_address do |oa| %> 
    <%= oa.input :client_id %> 
    <%= oa.input :unit_number %> 
    <%= oa.input :street_number %> 
    <%= oa.input :street_name %> 
    <%= oa.input :city %> 
    <%= oa.input :prov_state %> 
    <%= oa.input :postal_zip %> 
    <%= oa.input :country %> 
    <% end %> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

は、ここではどのような援助が大幅にいただければ幸いです!

EDIT#1 -

(byebug) @client.errors 
#<ActiveModel::Errors:0x007fb249813488 @base=#<Client id: nil, account_id: nil, name: "Test Client", client_type: "Corp", client_ident: "1234567890", created_at: nil, updated_at: nil>, @messages={}, @details={}> 
(byebug) 
+0

あなたが@から取得エラーclient.errors?あなたのオブジェクトがロールバックのためにデータベースに保存されていないように、サーバーのログからここに追加してください。 – user100693

+0

@ShefaleeChaudhary悪いところを手に入れてください –

+0

私はフォームに何の誤りも与えません。ちょうど次の問題を見直してください。 –

答えて

1

あなたは、関連するモデルの検証をオフにしたくない場合は(いくつかのケースでは理想的ではないです)、あなたが inverse_ofそう

has_one :office_address, inverse_of: :client 

ようinverse_of設定すべきであることを知ることは本当に価値がある、このブログはそれをうまく説明:

https://www.viget.com/articles/exploring-the-inverse-of-option-on-rails-model-associations

3

Byebugエラーを追加し、以下の通りあなたの関連付けを変更してください:5団体が提出されたに属し

class OfficeAddress < ApplicationRecord 
    belongs_to :client, optional: true 
end 
  • Railsのあなたのエントリがあるので、あなたのクライアントIDを検証ロールバックしています。
+1

しかし、それはまだ関連付けていない..私はこれが私の答えを悪い投稿を解決した –

0

この問題は、クライアントコントローラのcreateメソッドにupdate_attributesを追加することで解決しました。ように:

def create 
    @client = Client.new(client_params) 

    respond_to do |format| 
     if @client.save 
     ### This is what I added ### 
     @client.update_attributes!(account_id: @current_account.id) 
     @client.office_address.update_attributes!(client_id: @client.id) 

     format.html { redirect_to @client, notice: 'Client was successfully created.' } 
     format.json { render :show, status: :created, location: @client } 
     else 
     puts @client.errors 
     format.html { render :new } 
     format.json { render json: @client.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

私は最良の解決策ではありませんが、それは動作します。

関連する問題