如何在Rails中获取新创建的记录的ID并将该ID与其他模型相关联-Rails

时间:2018-08-30 11:46:00

标签: sql ruby-on-rails ruby rails-activerecord

我正在构建连接到React应用程序的Rails应用程序。 Rails应用程序有四个模型。为了方便讨论,我们假设它有两个模型:发送者和地址。发件人属于一个地址,而地址has_many个发件人。因此,发件人的外键为address_id。发件人注册新帐户时,也会创建一个地址。我正在尝试在Rails控制器中构建一些内容,以便在创建新地址时将其与发送方的address_id列相关联。我尝试基于this rails thread.的解决方案构建自己的独特解决方案,但并没有取得太大的成功。我在地址控制器中实现了以下内容:

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

我觉得我在这里使事情复杂化。所以我真的需要帮助。预先感谢!

2 个答案:

答案 0 :(得分:1)

  

NoMethodError(未定义的方法“发送方”)

首先,由于您与has_manysender关系而触发了错误,因此应该是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 

答案 1 :(得分:0)

如果您通过关联创建记录,则无需手动设置ID:

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

可以只是

address.sender.build

然后Rails会为您分配ID。