2015-10-20 116 views
1

我是新手,我正在創建一個帶有addersses客戶端的簡單應用程序。從堆棧溢出社區獲得一些建議和意見後,我decided to save addresses as a seperate modelRails - 自動創建相關模型

我現在試圖在我的應用程序中實現這一點,但我有問題得到的地址從「新客戶端」窗體正確保存。這裏是我的代碼到目前爲止:

class Address < ActiveRecord::Base 
    belongs_to :client 
end 

class Client < ActiveRecord::Base 
    has_one :address 
    before_create :build_address, unless: Proc.new { |client| client.address } 
end 



<%= form_for(@client) do |f| %> 
    <% if @client.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@client.errors.count, "error") %> prohibited this client from being saved:</h2> 

     <ul> 
     <% @client.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :phone_number %><br> 
    <%= f.text_field :phone_number %> 
    </div> 

    <%= f.fields_for :address do |a| %> 
    <div class="field"> 
     <%= a.label :house_number %><br> 
     <%= a.number_field :house_number %> 
    </div> 
    <div class="field"> 
     <%= a.label :house_name %><br> 
     <%= a.text_field :house_name %> 
    </div> 
    <div class="field"> 
     <%= a.label :post_code %><br> 
     <%= a.text_field :post_code %> 
    </div> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 

<% end %> 

這樣,客戶端已成功創建,但地址記錄是用空字段創建的。沒有錯誤。

任何幫助將不勝感激。

感謝

+0

你有'accepts_nested_attributes_for:address'?你在'params.require(:client)'中有什麼? –

回答

2

你需要accepts_nested_attributes_for

#app/models/client.rb 
class Client < ActiveRecord::Base 
    has_one :address 
    accepts_nested_attributes_for :address 
    before_create :build_address, unless: Proc.new { |client| client.address } 
end 

這將允許你做到以下幾點:

#app/controllers/clients_controller.rb 
class ClientsController < ApplicationController 
    def new 
     @client = Client.new 
     @client.build_address 
    end 
end 

這應該爲你工作。

+0

'build_address'不會運行兩次嗎? – max

+0

不是因爲2個原因。 1)build_address僅在'new'(而不是'create')中明確調用,並且2)after_create回調有一個條件,在地址不存在的情況下阻止構建 –

2

首先 - 很少有情況下ActiveModel回調不會導致悲傷。通常把邏輯放入你的模型是一件好事 - 但只要你需要它們就可以運行回調,而不需要在無關的測試中進行回調幾乎是不可能的。

在這種情況下,您只需構建地址,以便表單輸入在您的新操作中預填充。沒有其他理由讓您的所有客戶端實例始終擁有空地址記錄。

所以不是我們會做這樣的:

class Client < ActiveRecord::Base 
    has_one :address 
    accepts_nested_attributes_for :address 
end 

class ClientController < ApplicationController 
    def new 
    @client = Client.new 
    @client.build_address 
    end 

    def create 
    @client = Client.create(client_params) 
    # ... 
    end 

    def client_params 
    params.require(:client) 
      .permit(
      :name, :phone_number, 
      address_attributes: [:house_number, :house_name] 
     ) 
    end 
end 
+0

感謝您的回覆。這給我一個錯誤: 未定義的方法'build_address'爲零:NilClass – Craig

+0

編輯所以它應該工作 –

+0

原來是client.build_address不是@ client.address.build_address。再次感謝max – Craig