6

对 Rails 来说有点新意。

其中一个模型依赖于 has_many/belongs_to 关联中的另一个。

基本上,在我的应用程序上创建“帖子”时,用户还可以附加“图像”。理想情况下,这是两个独立的模型。当用户选择一张照片时,一些 JavaScript 会将其上传到 Cloudinary,并且返回的数据(ID、宽度、高度等)是 JSON 字符串化并设置在隐藏字段中。

# The HTML
= f.hidden_field :images, :multiple => true, :class => "image-data"

# Set our image data on the hidden field to be parsed by the server
$(".image-data").val JSON.stringify(images)

当然,这种关系存在于我的 Post 模型中

has_many :images, :dependent => :destroy
accepts_nested_attributes_for :images

和我的图像模型

belongs_to :post

我迷路的地方是如何处理 Post 控制器的 create 方法上的序列化图像数据?简单地解析 JSON 并保存它并不会在保存时使用数据创建 Image 模型(并且感觉不对):

params[:post][:images] = JSON.parse(params[:post][:images])

所有这些本质上都达到了类似以下参数的结果:

{"post": {"title": "", "content": "", ..., "images": [{ "public_id": "", "bytes": 12345, "format": "jpg"}, { ..another image ... }]}}

整个过程似乎有点复杂——我现在该怎么做,有没有更好的方法来做我一开始想做的事情?(像这样的嵌套属性也需要强参数......?)

编辑:

此时我收到此错误:

Image(#91891690) expected, got ActionController::Parameters(#83350730)

来自这条线...

@post = current_user.reviews.new(post_params)

似乎它不是从嵌套属性创建图像,但它是预期的。(无论是否存在 :autosave 都会发生同样的事情)。

4

3 回答 3

6

刚刚遇到了 ActionController::Parameters 错误的问题。您需要确保在您的 posts_controller 中允许所有必要的参数,如下所示:

def post_params
  params.fetch(:post).permit(:title, :content,
                             images_attributes: [:id, :public_id, :bytes, :format])
end

确保您允许 image.id 属性很重要。

于 2013-12-08T21:04:21.760 回答
1

您必须像这样构建参数:

params[:post][:images_attributes] = { ... }

您需要*_attributes一个键名images.

于 2014-12-02T02:36:11.507 回答
0

accepts_nested_attributes_for应该为您解决这个问题。所以做一个Post.create(params[:post])也应该照顾嵌套的图像属性。可能出错的是您没有autosave在 has_many 关系上指定一个。因此,您可能想看看这是否有所作为:

has_many :images, :dependent => :destroy, :autosave => true

当您保存帖子时,这也应该保存图像。

于 2013-07-10T14:38:22.537 回答