2017-10-20 69 views
0

我正在爲名爲DealerBranch模型的應用程序的管理頁面和稱爲地址的租用的嵌套關聯。我有一個控制器,它看起來像這樣創建一個新的經銷商分支:使用Tenantable嵌套屬性ActsAsTenant導致ActsAsTenant ::錯誤:: NoTenantSet:ActsAsTenant ::錯誤:: NoTenantSet

class Admin::DealerBranchesController < Admin::AdminApplicationController 
    def create 
    @dealer_branch = DealerBranch.new(dealer_branch_attributes) 
    if @dealer_branch.save 
     render :success 
    else 
     render :new 
    end 
    end 
end 

當創建運行它包括所有必要的屬性來創建關聯的地址。但是,地址租戶尚未創建,因爲我們正在構建租戶(DealerBranch)和相關租借(地址)。在分配到@dealer_branch的行上,我得到錯誤ActsAsTenant :: Errors :: NoTenantSet:ActsAsTenant :: Errors :: NoTenantSet

處理這種嵌套屬性的正確方法是什麼?

+0

發佈相關的型號代碼,你可能會想讀這個,如果你還沒有的http:// api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html –

回答

0

這最終成爲雞和雞蛋的問題。無法創建地址,因爲它需要一個DealerBranch,該地址需要屬於。父對象DealerBranch尚未保存。爲了使嵌套工作,我創建了一個create_with_address方法,將其分解先保存DealerBranch:

# We need this method to help create a DealerBranch with nested Address because address needs DealerBranch 
    # to exist to satisfy ActsAsTenant 
    def self.create_with_address(attributes) 
    address_attributes = attributes.delete(:address_attributes) 
    dealer_branch = DealerBranch.new(attributes) 

    begin 
     ActiveRecord::Base.transaction do 
     dealer_branch.save! 
     ActsAsTenant.with_tenant(dealer_branch) do 
      dealer_branch.create_address!(address_attributes) 
     end 
     end 
    rescue StandardError => e 
     if dealer_branch.address.nil? 
     # rebuild the attributes for display of form in case they were corrupted and became nil 
     ActsAsTenant.with_tenant(dealer_branch) { dealer_branch.build_address(address_attributes) } 
     end 

     unless dealer_branch.valid? && dealer_branch.address.valid? 
     return dealer_branch 
     else 
     raise e 
     end 
    end 

    dealer_branch.reload 
    end