Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 导轨3、S3、回形针附件(如图所示)';她自己的模型?_Ruby On Rails_Model_Amazon S3_Paperclip_Attachment - Fatal编程技术网

Ruby on rails 导轨3、S3、回形针附件(如图所示)';她自己的模型?

Ruby on rails 导轨3、S3、回形针附件(如图所示)';她自己的模型?,ruby-on-rails,model,amazon-s3,paperclip,attachment,Ruby On Rails,Model,Amazon S3,Paperclip,Attachment,因此,我正在开发一个应用程序,用户可以上传和管理照片,并将一系列特定于行业的元数据附加到照片上 照片模型中包含所有这些元数据,我使用回形针将实际图像文件附加到模型中,并将图像存储在AmazonS3上 用户交互当前的工作方式如下: 用户单击“添加照片”并被带到“新照片”页面,在该页面上,他将看到一张表单 表单上的第一件事是文件选择器。用户选择一个文件 下面是几个不同的元数据字段供用户填写,因此用户需要填写这些字段 用户点击submit,文件上传并创建一个新的照片对象,用户被重定向到另一个页面 因此

因此,我正在开发一个应用程序,用户可以上传和管理照片,并将一系列特定于行业的元数据附加到照片上

照片模型中包含所有这些元数据,我使用回形针将实际图像文件附加到模型中,并将图像存储在AmazonS3上

用户交互当前的工作方式如下:

  • 用户单击“添加照片”并被带到“新照片”页面,在该页面上,他将看到一张表单
  • 表单上的第一件事是文件选择器。用户选择一个文件
  • 下面是几个不同的元数据字段供用户填写,因此用户需要填写这些字段
  • 用户点击submit,文件上传并创建一个新的照片对象,用户被重定向到另一个页面
  • 因此,我想做的一个明显的改进是在这个过程开始时将照片实际上传,这样在点击提交和重定向到下一页之间就不会有明显的延迟。上传完成后,能够向用户显示他们照片的缩略图预览也很好,这样他们就可以在填写表单时看到他们正在放入元数据的照片

    我想,如果我将图像文件拆分为它自己的模型,我就可以做到这一点,但我会参考这样的图像:

    @photo.attachment.file.url
    而不是我现在使用的更简单的
    @photo.file.url
    。我不想把它埋得太深

    此外,将其分为两种模式会引发管理孤儿的问题,我目前不必处理这一问题

    因此,我的问题是:

  • 有没有一种好方法——最好不要使用Flash——来创建这种异步上传行为而不分为两个模型,或者--
  • 如果我必须将元数据和文件分为两个模型,是否有办法让回形针将附件视为自己的模型,以便我可以使用
    而不是
    访问它。

  • 我知道这是个大问题,所以提前非常感谢您的帮助

    我建议您将
    新建
    操作替换为
    编辑
    操作(当用户选择该操作时,您可以自动创建照片模型。这样,您可以使用AJAX文件上载(某些现代浏览器支持)使用Flash备份进行上传,并编辑元数据。要进行上传,请查看或。

    这样简单地定义照片url有什么错

    class Photo
      def url(*args)
        attachment.url(*args)
      end
    end
    

    无需在这里花心思。

    基本上,您将照片对象的创建分为两部分:上传照片和添加元数据。在非AJAX站点中,这将是两个单独的步骤,分别位于两个单独的页面上


    我要做的是允许AJAX上传实例化一个照片对象,并保存它(与上传的照片一起)。然后,我会让AJAX代码将一个令牌返回到与会话变量相对应的站点,让表单知道照片的记录已经创建。当用户提交表单的其余部分时,如果令牌存在,它将知道填充已经创建的照片对象上的数据。如果令牌不存在,它将知道它需要从头开始创建照片对象。

    经过一周的实验后,我想我应该发布我最后做的事情:

    事实上,我确实将照片分成了两个模型,因为我最终不得不用我尝试过的任何方法创建空记录。我发现最终使用两个单独的模型更容易,因为:

  • 它使在Rails约定中工作变得更容易(使用第二个模型的标准REST操作来处理异步更新,而不必向父模型添加多个自定义操作)

  • 无论我尝试了哪种选择,我最终都可能会有孤立的记录。我发现,拥有一个除非有效否则永远不会保存的父对象(在我的例子中是照片模型)更容易,并具有可能是孤立的附件。这些附件从未在应用程序中的任何位置直接调用,因此不存在意外提取空记录的风险,也不需要设置默认范围或其他仅显示“有效”照片的内容。清除孤立项非常简单,只需执行
    Attachment.where即可(:parent_id=>nil)
    并删除所有这些

  • 我可以通过简单地将附件委派给照片来维护前面的代码。请参见另一个问题


  • 我希望这能为其他人省去一些麻烦。如果你需要带有附件的Ajax功能,最好让它们成为自己的模型。另外,要将Ajax文件上传到表单,请查看。这保存了我的应用程序。

    只是想知道,你是否没有设置关联的dependent子句?例如

    Class Photo < ActiveRecord::Base
      :has_one :attachment, :dependent => :destroy
    end
    
    Class-Photo:destroy
    结束
    

    这将防止孤立记录,因为每当在Photo上调用销毁方法时,它都会首先执行Photo.attachment.destroy。它与:has_many一起工作。

    这是一个好主意。谢谢!尽管如此,它实际上并没有回答我的问题:我应该将其拆分为两个模型以获得AJAX功能,还是应该做一些不同的事情TW:我从Thoughtbot中认出了你的头像——谢谢你的回形针!这很有趣,我没有想到。你是在NEW/CREATE中复制编辑/更新操作的代码,还是有一种简单的方法告诉新操作改用EDIT/UPDATE?另外,我想我会将所有验证更改为“:on=>:UPDATE”而不是默认值?@Andrew我可能会从“新建”重定向到编辑(在初始化并保存基本照片模型之后)。至于验证,是的,您可以将它们移动到更新,但是您可能必须允许大多数字段为空(因为它们是更新的AJAX)。