0

私はしばらくの間探し回っていましたが、何が原因なのかわからないようです.ボランティアと彼の自宅と職場の住所を保存するモデルがありました. 私は何かを変更しました(私の人生のために何を理解することはできないようです)が、アドレスが設定されていません。

これは私の主なモデルです:

class HumanVolunteer < ActiveRecord::Base

  has_one :primaryPhone, :class_name => "PhoneNumber", :foreign_key => "id", :primary_key => "phone_id"
  has_one :primaryEmail, :class_name => "Email", :foreign_key => "id", :primary_key => "email_id"
  has_one :work_adr, :class_name => "Address", :foreign_key => "id", :primary_key => "workaddressid"
  has_one :home_adr, :class_name => "Address", :foreign_key => "id", :primary_key => "homeaddressid"

  attr_accessible :firstName, :lastName, :homeaddressid, :notes, :status, :workaddressid, :home_adr, :work_adr, 
              :primaryPhone, :primaryEmail, :home_adr_attributes, :work_adr_attributes, :primaryPhone_attributes, 
              :primaryEmail_attributes

  accepts_nested_attributes_for :home_adr 
  accepts_nested_attributes_for :work_adr 
  accepts_nested_attributes_for :primaryPhone
  accepts_nested_attributes_for :primaryEmail
end

および住所モデル:

class Address < ActiveRecord::Base
  attr_accessible :city, :line1, :line2, :notes, :state, :zipcode
  belongs_to :human_volunteer
end

human_volunteers_controller のスニペットを次に示します。

# GET /human_volunteers/new
  # GET /human_volunteers/new.json
  def new
    @human_volunteer = HumanVolunteer.new
    @human_volunteer.build_home_adr
    @human_volunteer.build_work_adr
    @human_volunteer.build_primaryPhone
    @human_volunteer.build_primaryEmail

    # Set the Breadcrumbs for this page
    @breadcrumbs = { "Dashboard" => "/", "Human Volunteers" => "/human_volunteers"}
    @current_page = "New Volunteer"

    respond_to do |format|
      format.html # new.html.erb
      format.json { render :json => @human_volunteer }
    end
  end

  # GET /human_volunteers/1/edit
  def edit
    @human_volunteer = HumanVolunteer.find(params[:id])
    if(@human_volunteer.home_adr.nil?)
      @human_volunteer.build_home_adr
    end

    if(@human_volunteer.work_adr.nil?)  
      @human_volunteer.build_work_adr
    end

    if(@human_volunteer.primaryPhone.nil?)
      @human_volunteer.build_primaryPhone
    end

    if(@human_volunteer.primaryEmail.nil?)
      @human_volunteer.build_primaryEmail
    end

    @breadcrumbs = { "Dashboard" => "/", "Human Volunteers" => "/human_volunteers"}
    @current_page = "Edit Volunteer: <em>" + @human_volunteer.firstName + " " + @human_volunteer.lastName + "</em>";
  end

  # POST /human_volunteers
  # POST /human_volunteers.json
  def create
    # create the volunteer
    @human_volunteer = HumanVolunteer.new(params[:human_volunteer])

    respond_to do |format|
      if @human_volunteer.save
        format.html { redirect_to @human_volunteer, :notice => @human_volunteer.firstName + ' ' + @human_volunteer.lastName + ' was successfully created.' }
        format.json { render :json => @human_volunteer, :status => :created, :location => @human_volunteer }
      else
        format.html { render :action => "new" }
        format.json { render :json => @human_volunteer.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /human_volunteers/1
  # PUT /human_volunteers/1.json
  def update
    @human_volunteer = HumanVolunteer.find(params[:id])

    respond_to do |format|
      if @human_volunteer.update_attributes(params[:human_volunteer])
        format.html { redirect_to @human_volunteer, :notice => @human_volunteer.firstName + ' ' + @human_volunteer.lastName + ' was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render :action => "edit" }
        format.json { render :json => @human_volunteer.errors, :status => :unprocessable_entity }
      end
    end
  end

ログを見ると、問題が何であるかがわかります。最初に人間のボランティアが保存され、アドレスキーにnullを使用してから、アドレスが保存されます(電話番号と電子メールモデルでも同じ問題が発生し、同じように設定されていますアドレスに) ) アドレスが保存され、人間のボランティアが新しい値で再度更新されることはありません。

  Parameters: {"authenticity_token"=>"dD+ut6noFPw8mJHq4rUJpuNBD1o+q0Hi8a+qOeetzMc=", "utf8"=>"✓", "human_volunteer"=>{"lastName"=>"Koch", "work_adr_attributes"=>{"line1"=>"", "line2"=>"", "zipcode"=>"", "state"=>"", "city"=>""}, "primaryEmail_attributes"=>{"email"=>""}, "primaryPhone_attributes"=>{"number"=>""}, "notes"=>"", "home_adr_attributes"=>{"line1"=>"123 Who Knows land", "line2"=>"", "zipcode"=>"11741", "state"=>"TS", "city"=>"testville"}, "firstName"=>"Ken", "status"=>"Investigative Candidate"}}
   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
   (0.2ms)  BEGIN
   (0.1ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
   (0.1ms)  BEGIN
  SQL (2.3ms)  INSERT INTO "human_volunteers" ("created_at", "email_id", "firstName", "homeaddressid", "lastName", "notes", "phone_id", "status", "updated_at", "workaddressid") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"  [["created_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["email_id", nil], ["firstName", "Ken"], ["homeaddressid", nil], ["lastName", "Koch"], ["notes", ""], ["phone_id", nil], ["status", "Investigative Candidate"], ["updated_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["workaddressid", nil]]
  SQL (0.8ms)  INSERT INTO "phone_numbers" ("created_at", "notes", "number", "phone_id", "phone_type", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["created_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["notes", nil], ["number", ""], ["phone_id", nil], ["phone_type", nil], ["updated_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00]]
  SQL (0.7ms)  INSERT INTO "emails" ("created_at", "email", "notes", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["email", ""], ["notes", nil], ["updated_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00]]
  SQL (0.9ms)  INSERT INTO "addresses" ("city", "created_at", "line1", "line2", "notes", "state", "updated_at", "zipcode") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["city", ""], ["created_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["line1", ""], ["line2", ""], ["notes", nil], ["state", ""], ["updated_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["zipcode", nil]]
  SQL (0.5ms)  INSERT INTO "addresses" ("city", "created_at", "line1", "line2", "notes", "state", "updated_at", "zipcode") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["city", "testville"], ["created_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["line1", "123 Who Knows land"], ["line2", ""], ["notes", nil], ["state", "TS"], ["updated_at", Tue, 07 Aug 2012 16:47:16 UTC +00:00], ["zipcode", 11741]]
  (17.8ms)  COMMIT

編集:これが助けになる場合は、ログの古いエントリの例を次に示します。

Started POST "/human_volunteers" for 127.0.0.1 at Sat Jul 28 09:08:59 -0400 2012
Processing by HumanVolunteersController#create as HTML
  Parameters: {"human_volunteer"=>{"firstName"=>"Ken", "work_adr"=>{"city"=>"", "state"=>"", "zipcode"=>"", "line1"=>"", "line2"=>""}, "status"=>"Trainee", "home_adr"=>{"city"=>"fdsa", "state"=>"Nasdf", "zipcode"=>"11729", "line1"=>"asdf fdsafd", "line2"=>""}, "primaryEmail"=>"ken.koch@essencedesigns.net", "primaryPhone"=>"6316813806", "lastName"=>"Koch", "notes"=>"\r\nHes a good guy"}, "authenticity_token"=>"bgbecE+nMxNrPtleNOLfO/MqRib0cXmDMqL5JaPyC10=", "utf8"=>"✓"}
  [1m[36m (0.1ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (0.5ms)[0m  INSERT INTO "emails" ("created_at", "email", "notes", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["email", "ken.koch@essencedesigns.net"], ["notes", nil], ["updated_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00]]
  [1m[36m (19.1ms)[0m  [1mCOMMIT[0m
  [1m[35m (0.1ms)[0m  BEGIN
  [1m[36mSQL (0.5ms)[0m  [1mINSERT INTO "phone_numbers" ("created_at", "notes", "number", "phone_id", "phone_type", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"[0m  [["created_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["notes", nil], ["number", "6316813806"], ["phone_id", nil], ["phone_type", nil], ["updated_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00]]
  [1m[35m (56.9ms)[0m  COMMIT
  [1m[36m (0.1ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (2.5ms)[0m  INSERT INTO "addresses" ("city", "created_at", "line1", "line2", "notes", "state", "updated_at", "zipcode") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["city", ""], ["created_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["line1", ""], ["line2", ""], ["notes", nil], ["state", ""], ["updated_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["zipcode", nil]]
  [1m[36m (9.4ms)[0m  [1mCOMMIT[0m
  [1m[35m (0.1ms)[0m  BEGIN
  [1m[36mSQL (0.5ms)[0m  [1mINSERT INTO "addresses" ("city", "created_at", "line1", "line2", "notes", "state", "updated_at", "zipcode") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"[0m  [["city", "Deer Park"], ["created_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["line1", "294 West 15th St"], ["line2", ""], ["notes", nil], ["state", "NY"], ["updated_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["zipcode", 11729]]
  [1m[35m (7.0ms)[0m  COMMIT
  [1m[36m (0.1ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (1.1ms)[0m  INSERT INTO "human_volunteers" ("created_at", "email_id", "firstName", "homeaddressid", "lastName", "notes", "phone_id", "status", "updated_at", "workaddressid") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"  [["created_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["email_id", 5], ["firstName", "Ken"], ["homeaddressid", 14], ["lastName", "Koch"], ["notes", "\r\nHes a good guy"], ["phone_id", 11], ["status", "Trainee"], ["updated_at", Sat, 28 Jul 2012 13:08:59 UTC +00:00], ["workaddressid", 13]]
  [1m[36m (6.1ms)[0m  [1mCOMMIT[0m
Redirected to http://localhost:3000/human_volunteers/1
Completed 302 Found in 178ms (ActiveRecord: 112.1ms)

ログに戻って、機能しているものを見つけることができました。最後に挿入されたのは human_volunteer でした。最初に住所、電子メール、電話番号を挿入し、次にボランティアを挿入するときにそれらの ID を使用しました。

編集:エラーが発生していないこと、すべてが通過していること、データが接続されていないことを報告することもできます。

順序の変更を引き起こす可能性のあるアイデアはありますか? これに影響を与える何かを変更したことはわかりません。

更新: has_one 行を変更しようとしましたが、行を次のように変更したときに、少なくとも (良くも悪くも) エラーを生成することができました。

  has_one :workaddress, :class_name => "Address", :foreign_key => "id", :primary_key => "workaddress"
  has_one :homeaddress, :class_name => "Address", :foreign_key => "id", :primary_key => "homeaddress"

毎回アドレスID 1を使用しようとしますが、取得します

ActiveRecord::RecordNotUnique (PG::Error: ERROR:  duplicate key value violates unique constraint "addresses_pkey"
DETAIL:  Key (id)=(1) already exists.

また、primary_key フィールドを取り出すと動作するように見えますが、両方を同じアドレスに設定しようとすると、次の ID (22、23、24 など) を除いて同じエラーが発生します。試行するたびに)

多分それは問題にいくらかの光を当てますか?これからもぐるぐるまわしていきます。

ありがとうございました - ケン

4

1 に答える 1

0

実行可能な解決策と思われるものを思いつきました。

IDが最初に設定されると、すべてが機能しているように見えたので、作成アクションの下のコントローラーに手動でリンクしました:

@human_volunteer.homeaddress.save
@human_volunteer.homeaddressid = @human_volunteer.homeaddress.id
@human_volunteer.workaddress.save
@human_volunteer.workaddressid = @human_volunteer.workaddress.id

これで、ボランティアが作成されたときにアドレスが設定され、他のすべてがうまくいくはずです。

私が見ることができる唯一の追加の考慮事項は、バリデーターをアドレスに追加するときに、アドレスが実際に検証できることを確認してから、全体の作成を許可することです。

みんな、ありがとう、

-ケン

于 2012-08-08T17:37:16.713 に答える