2013-07-10 233 views
6

有点新的Rails的东西,在一点点。在Rails 4中保存嵌套模型

其中一个模型的处于的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) 

和当然,这种关系在我的岗位模型

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

和我的形象模型存在

belongs_to :post 

在哪里我迷路是做什么用的序列化的图像数据做在Post控件的创建方法上?简单地解析JSON并保存它不会在保存创建与数据的图像模式(和感觉不对):

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) 

好像它没有创造从嵌套属性的图像,但它的预期。 (同样的事情发生时:自动保存是否存在)。

+0

我有完全相同的问题 – nduplessis

+0

MB可以帮助http://stackoverflow.com/questions/10878930/got-activerecordassociationtypemismatch-on-model-save – user2915517

回答

6

刚刚与那个的ActionController ::参数误差这一问题。你需要确保你允许使用所有必要的参数,你posts_controller,像这样:

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

重要的是要确保你允许image.id属性是很重要的。

0

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

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

当你保存你的文章时,也应该保存图像。

+0

感谢您的答复。尽管我没有看到任何区别,但我确实得到了一个我上面编辑过的有趣答案('为了简洁起见'Image expected,但是获取了参数')。 – ICDevin

1

必须建立这样的PARAMS:

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

你的images的按键名称需要*_attributes