Rails 3 и проблема Paperclip - Как сохранить загруженные файлы в файловую систему? - PullRequest
1 голос
/ 22 июня 2011

Я следовал этому учебнику , пытаясь интегрировать 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 модели в базе данных?

1 Ответ

1 голос
/ 22 июня 2011

Чтобы сохранить файлы, вам нужно создать модели активов, а также назначить прикрепленный_файл этим моделям (которые вы также назвали 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

Однако вы делаете несколько не-стандартные вещи здесь, и делает жизнь сложнее для себя, чем это должно быть.Вместо использования file_field_tag вы должны использовать помощник file_field с экземпляром Asset в памяти.Например, если бы вы следовали учебнику, на который вы ссылались, у вас было бы что-то вроде:

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

Вы также должны сообщить своей модели User, что при сохранении можно принимать модели дочерних активов:

def User
  accepts_nested_attributes_for :assets
end

Затем в действии контроллера вы просто создадите несколько новых ресурсов в памяти, чтобы цикл в fields_for работал:

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

Надеюсь, это имеет смысл.Продолжай - ты доберешься до места.

...