我正在构建连接到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
我觉得我在这里使事情复杂化。所以我真的需要帮助。预先感谢!
答案 0 :(得分:1)
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
答案 1 :(得分:0)
如果您通过关联创建记录,则无需手动设置ID:
address.sender.build({address_id: address.id })
可以只是
address.sender.build
然后Rails会为您分配ID。