如何使用s3_direct_upload gem设置parent_id?

时间:2013-08-09 21:29:40

标签: ruby-on-rails has-many belongs-to

Newbie on Rails 3.2.14,在Heroku上测试,使用s3_direct_upload gem将图像文件上传到S3。

我的宝石工作正常。拖放,进度条和直接上传到S3工作很棒。上传与附件模型相关联。在上传时正确创建新记录。好到目前为止。

我遇到的问题是我想设置新记录的parent_id字段,但不知道如何传入它.Geot不使用传统表单提交上传,它是通过javascript处理的:

<%= s3_uploader_form callback_url: attachments_url, callback_param:
"attachment[attachment_url]", id: "myS3Uploader" do %>
    <%= file_field_tag :file, multiple: true %>
<% end %>

attachments_controller.rb中的创建操作:

def create
  @attachment = Attachment.create(params[:attachment])
end

调用javascript视图create.js.erb

<% if @attachment.new_record? %>
  alert("Failed to upload attachment: <%= j @attachment.errors.full_messages.join(', ').html_safe %>");
<% else %>
  $("#attachments").prepend("<%= j render(@attachment) %>");
<% end %>

检查记录保存是否有效,并将新的上传缩略图添加到当前视图。

由于我没有处理常规表格或create行动,我有点难过。

我可以使用before_save

在附件模型中设置默认值
before_save :set_defaults

def set_defaults
  self.name = "Photo"
  self.parent_id = 1
end

但在创建父对象(即博客文章)期间,将在完成上传的页面上定义parent_id

我知道我应该使用has_manybelongs_to并且它们已经设置好并且工作正常但是由于我没有使用传统表单来提交数据我不知道如何分配parent_id。

我尝试在表单中传递parent_id并在模型中访问它:

<%= s3_uploader_form callback_url: attachments_url(:parent_id => 99), callback_param:
"attachment[attachment_url]", id: "myS3Uploader" do %>

它没有用,我知道我不应该在模型中访问params。

任何有助于我超越这一点的帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,所以我在这里阅读了很多的问题和答案,最后自己把它拼凑起来。

所以我在正确的轨道上传递(:parent_id => 99),但我不应该尝试在模型中使用它,我应该在控制器中使用它。

我更改了控制器中的create方法以获取我创建的草稿Parent对象,并使新的Attachment记录成为它的子项:

def create
  @parent = Parent.find(params[:parent_id])
  @attachment = @parent.attachments.create(params[:attachment])
end

传入的:parent_id的值来自'新'父表单,因此实际上是(:parent_id => @parent.id)

现在一切正常。只是我完全没有经验阻止我:)