我刚刚开始学习 Ruby 和 Ruby on Rails,这实际上是我第一次真正要问关于 SO 的问题,真的让我很生气。
我正在编写一个 REST api,我需要在其中接收图像 url 并将其存储在我的数据库中。
为此,我做了一个名为 ImageSet 的模型,它使用carrierwave 来存储上传的图像,如下所示:
class ImageSet < ActiveRecord::Base
has_one :template
mount_uploader :icon1, Icon1Uploader
mount_uploader :icon2, Icon2Uploader
def icon1=(url)
super(url)
self.remote_icon1_url = url
end
def icon2=(url)
super(url)
self.remote_icon2_url = url
end
end
此 icon1 和 icon2 都作为 url 接收,因此设置器覆盖,它们不能为空。我的上传器类正在创建一些带有扩展白名单和覆盖全名的版本。
然后,我有这个模板类,它接收 ImageSet 的嵌套属性。
class Template < ActiveRecord::Base
belongs_to :image_set
accepts_nested_attributes_for :image_set
(other stuff)
def image_set
super || build_image_set
end
end
此模型有一个不能为空的 image_set_id。
考虑一个简单的请求,比如带有 json 的帖子:
{
"template":
{
"image_set_attributes":
{
"icon1": "http....",
"icon2": "http...."
}
}
}
它总是给出:ImageSet 不能为空。
我可以temp.image_set
从控制台访问 if temp
is a Template
,我也可以在那里设置值,比如,temp.image_set.icon = 'http...'
但我似乎无法弄清楚为什么它会在那里中断。它应该创建 image_set,将其属性设置为保存模板类,模板类会将其 id 分配给其自己模型中的相应列-
我的控制器正在做:
(...)
def create
@template = Template.create(params)
if @template
render status: 200
else
render status: 422
end
end
private
def params
params.require(:template).permit(image_set_attributes: [:id, :icon1, :icon2])
end
(...)
希望你能给我这个建议。
谢谢!