首页 > 解决方案 > 如何在rails中获取新创建记录的id并将id与另一个模型相关联-Rails

问题描述

我正在构建一个连接到反应应用程序的 Rails 应用程序。rails 应用程序有四个模型。为了争论起见,让我们假设它有两个模型:发送者和地址。发件人属于_一个地址,而一个地址有_许多发件人。因此,发件人的外键为 address_id。当发件人注册一个新帐户时,他也会创建一个地址。我正在尝试在我的 rails 控制器中构建一些东西,从而在创建新地址时它与发件人的 address_id 列相关联。我尝试根据这个 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

我觉得我在这里把事情复杂化了。所以我真的需要这个帮助。提前致谢!

标签: sqlruby-on-railsrubyrails-activerecord

解决方案


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

首先,错误触发是因为您与 有has_many关系sender,所以应该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 

推荐阅读