1

このチュートリアルに従って、 PaperclipをRails3アプリケーションに統合しようとしました。

ただし、私の場合は、このチュートリアルで説明されているものとは少し異なります。

私の場合、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_idJavascriptによって制御されます。

フォームが送信されると、uploadメソッドが呼び出されます。

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

params[:assets]アップロードされたファイルをファイルシステムに保存Assetし、データベースに対応するモデルを作成するにはどうすればよいですか?

4

1 に答える 1

1

ファイルを保存するには、アセットモデルを作成し、それらのモデルにattached_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

しかし、あなたはここで多くの非標準的なことをしていて、あなた自身の生活を必要以上に難しくしています。を使用する代わりに、メモリ内でインスタンス化されたアセットでヘルパーをfile_field_tag使用する必要があります。file_fieldたとえば、リンクしたチュートリアルに従った場合、次のようになります。

<% 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 に答える