簡體   English   中英

如何在 rails 中獲取新創建記錄的 id 並將該 id 與另一個模型相關聯 - Rails

[英]How to get the id of newly created record in rails & associate the id with another model - Rails

我正在構建一個連接到 React 應用程序的 Rails 應用程序。 rails 應用程序有四種模型。 這里為了爭論起見,讓我們假設它有兩個模型:發件人和地址。 發件人屬於_一個地址,一個地址有_多個發件人。 因此,發件人具有 address_id 的外鍵。 當發件人注冊一個新帳戶時,他也會創建一個地址。 我試圖在我的 rails 控制器中構建一些東西,當創建新地址時,它與發件人的 address_id 列相關聯。 我嘗試基於此 rails 線程的解決方案構建自己獨特的解決方案 但我沒有取得太大的成功。 我在地址控制器中實現了以下內容:

 class AddressesController < ActionController::API def show @address = Address.find(params[:id]) end def create success = false address = Address.new(address_params) sender = @sender if address.save address_id = address.sender.build({address_id: address.id }) success = true if !address_id.empty? else render json: { errors: address.errors.full_messages }, status: :bad_request end if success = true render json: {status: 'address created successfully'}, status: :created else render('edit') end end def address_params params.require(:address).permit(:streetname, :zipcode, :city, :country) end end

我在終端中收到此錯誤:

 NoMethodError (undefined method `sender' for #<Address:0x00007f93b2576050> Did you mean? senders senders= send): app/controllers/addresses_controller.rb:21:in `create'

所以我在我的發件人控制器中放置了一個 attr_accessor:

 class SendersController < ApplicationController attr_accessor :sender def show @sender = Sender.find(params[:id]) end def create @sender = Sender.new(sender_params) if @sender.save render json: {status: 'sender created successfully'}, status: :created else render json: { errors: sender.errors.full_messages }, status: :bad_request end end def sender_params params.require(:sender).permit(:userid, :name, :email, :photourl, :address_id) end end

我覺得我把這里的事情復雜化了。 所以我真的需要幫助。 提前致謝!

NoMethodError(未定義方法`sender')

首先,觸發錯誤是因為您與senderhas_many關系,所以應該是senders而不是sender

address.senders.build

當發件人注冊一個新帳戶時,他也會創建一個地址。 我試圖在我的 rails 控制器中構建一些東西,當創建新地址時,它與發件人的 address_id 列相關聯。

其次,你的做法是錯誤的。 您可以使用belongs_to關聯的可用方法。 例如,在您的情況下,您可以調用@sender.build_address

address = @sender.build_address(address_params)

build_association方法返回關聯類型的新對象。 該對象將從傳遞的屬性中實例化,並設置通過該對象的外鍵的鏈接,但尚未保存關聯的對象。

因此,最終創建將如下所示(刪除不必要的代碼后)

def create 
  address = @sender.build_address(address_params)

  if address.save
    render json: {status: 'address created successfully'}, status: :created
  else
    render json: { errors: address.errors.full_messages }, status: :bad_request
  end
end 

如果您通過關聯創建記錄,則無需手動設置 id:

address.sender.build({address_id: address.id })

可以只是

address.sender.build

rails 會為你分配 id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM