【发布时间】:2018-08-30 11:46:00
【问题描述】:
我正在构建一个连接到 react 应用的 rails 应用。 rails 应用程序有四个模型。为了争论起见,让我们假设它有两个模型:发送者和地址。发件人属于_一个地址,而一个地址有_许多发件人。因此,发件人的外键为 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'
所以我在我的 senders 控制器中放置了一个 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
我觉得我在这里把事情复杂化了。所以我真的需要这个帮助。提前致谢!
【问题讨论】:
-
我将这些添加为 cmets,因为它们超出了问题标题的范围,但您的代码存在几个问题:
-
1) 关于 'sender' 未定义的错误是指您调用
address.sender的位置 - 它表示 Address 模型没有sender方法。错误文本的其余部分很重要:它表明您确实有一个senders方法,因此地址模型中的关系可能是has_many :senders,在这种情况下您需要address.senders.build. -
2) association.build 返回新记录,所以
address_id将包含发件人记录(不是地址ID)——这不是一个很好的变量名 -
3)
if success = true使用的是赋值 (=) 而不是比较 (==) 所以你 设置 成功为真,而不是检查它.因为它是一个布尔值,if success很好。
标签: sql ruby-on-rails ruby rails-activerecord