我刚刚开始学习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接收,因此setter覆盖,并且它们不能为null。 我的上传程序类正在创建一些带有扩展名白名单和覆盖full_name的版本。
然后,我有这个模板类,它接收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不能为null。
考虑一个简单的请求,比如带有json的帖子:
{
"template":
{
"image_set_attributes":
{
"icon1": "http....",
"icon2": "http...."
}
}
}
总是给出:ImageSet不能为空。
如果temp.image_set
是temp
,我可以从控制台访问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
(...)
希望你能给我这个提示。
谢谢!
答案 0 :(得分:0)
accepts_nested_attributes与belongs_to无法正常工作。
在某些情况下可能会被欺骗,但你最好在其他地方更改你的应用程序,以“轨道方式”做事。
模板validate_presence_of :image_set
,对吗?如果是这样,问题是这意味着必须始终在模板之前创建,但accepts_nested_attributes
认为模板是父模板,并且首先尝试保存父模板。
您可以做的最简单的事情是切换关系,因此模板has_one :image_set
和ImageSet belongs_to :template
。否则你将不得不写一些相当奇怪的控制器逻辑来按预期处理params。