1

我在将 SQLlite Rails 3 应用程序转移到 Mongoid Rails 3 应用程序时遇到问题。在 SQLlite 版本中,我可以轻松地将一个模型(“图像”)的图像上传表单(使用 Paperclip)包含在另一个模型(“产品”)的嵌套表单中。这是我的“新”产品形式:

  <%= form_for @product, :html => {:multipart => true} do |f| %>
     <% f.fields_for :images do |image_form| %>
       <%= f.label :productphoto %>
       <%= f.file_field :productphoto %><br />
    <% end %>
 <% end %>

这是“显示”视图:

    <% @product.images.each do |image| %>
      <%= image_tag image.productphoto.url(:gallerythumb) %><br />
    <% end %>

当我尝试在我的 Mongoid Rails 3 应用程序(使用 Carrierwave)中使用相同的产品视图时,我收到以下错误:

    TypeError in Stores#show: 
    can't convert nil into String
    <%= image_tag product.image.url(:gallerythumb) %>

我很确定我在 Mongoid 版本中的模型是正确的,因为如果我在我的“图像”模型中添加一个字符串(如“名称”)并将其嵌套在“产品”表单中,它就可以工作。此外,我能够将图像上传到非嵌套模型表单中。

任何帮助将不胜感激!

4

3 回答 3

2

我自己也有类似的问题。问题不在于我认为的图像上传,而是问题在于 Rails 无法将 :images 识别为数组。如果您查看 fields_for 帮助器的 Rails 源代码,您会发现它检查方法“_attributes=”。如果那不存在,表单将作为普通字段而不是数组发布(参数将是“images”而不是“images[0]”)

您必须将以下行添加到模型中:

accepts_nested_attributes_for :images
于 2010-08-20T08:34:50.143 回答
0

这很可能是 Lewy 链接到的问题 - 该问题特定于您的 Carrierwave 上传器安装在嵌入式关联中的子文档上并且您正在保存父文档的安排,尽管您没有明确显示这是否是您的数据是如何建模的,我怀疑是这种情况,因为您注意到它适用于非嵌套表单(大概是保存子文档,而不是父文档)。

如果您深入研究与该问题相关的讨论,您会发现一些建议的解决方法。以下是我最终让 Carrierwave 在这种情况下为我工作的结果:

https://gist.github.com/759788

完全归功于 zerobearing2,我分叉了它的要点,我只是做了一些小改动,让它在 Rails 3.0.3 中工作,并用相关讨论的摘要信息评论了我的要点。

于 2010-12-30T14:33:43.853 回答
0

它是载波或 mongoid bug

https://github.com/jnicklas/carrierwave/issues#issue/81

于 2010-11-25T07:45:45.450 回答