1

我按照本教程尝试将 Paperclip 集成到我的 Rails 3 应用程序中。

但是,我的情况与本教程中描述的情况有些不同。

就我而言,User模型已经存在于数据库中,我想上传文件并将它们与上传者相关联。

以下是我的代码的相关部分:

class User < ActiveRecord::Base
  has_many :assets, :foreign_key => "uploader_id"
end

class Asset < ActiveRecord::Base
  belongs_to :uploader, :class_name => "User"  
  has_attached_file :asset, :styles => { :thumb => "100x100#" }
end

我的案例和教程之间的主要区别在于上传输入字段不在User表单内:

# views/lounge/index.html.erb
<%= form_tag('/lounge/upload', :multipart => true) do %>
  <input id="uploader_id" name="uploader_id" type="hidden" />
  <%= file_field_tag "assets[]", :multiple => true %>
<% end %>

隐藏uploader_id输入字段的值由 Javascript 控制。

提交表单时,将upload调用该方法:

class LoungeController < ApplicationController
  def upload
    uploader = User.find(params[:uploader_id])
    # ??
  end
end

params[:assets]为了将上传的文件保存到文件系统并Asset在数据库中创建相应的模型,我应该怎么做?

4

1 回答 1

1

要保存文件,您需要创建资产模型,并将 attach_file 分配给这些模型(您也称为asset,这可能会让人感到困惑)。在简单的情况下,这看起来像:

user = User.find(id)
asset = user.assets.new
asset.asset = params[:asset]
asset.save

要执行多个文件,只需快速循环:

user = User.find(id)
params[:assets].each do |asset|
  asset = user.assets.new
  asset.asset = asset
  asset.save
end

然而,你在这里做了很多非标准的事情,让自己的生活变得比需要的更难。而不是 using file_field_tag,您应该使用file_field在内存中实例化 Asset 的助手。例如,如果您按照链接到的教程进行操作,您将获得以下内容:

<% form_for @user do |f|
  <% f.fields_for :assets do |asset| %>
    <%= asset.file_field :asset %>
  <% end %>
<% end %>

您还需要告诉您的用户模型在保存时可以接受子资产模型:

def User
  accepts_nested_attributes_for :assets
end

然后在您的控制器操作中,您只需在内存中构建一些新资产,以便 fields_for 中的循环正常工作:

def upload
  @user = User.find(id)
  5.times do { @user.assets.build }
end

希望这是有道理的。继续前进 - 你会到达那里。

于 2011-06-22T10:30:08.743 回答