1

私はthis tutorialに続いて、Paperclipを自分のRails 3アプリケーションに統合しようとしています。Rails 3とPaperclipの問題 - アップロードされたファイルをファイルシステムに保存するには?

しかし、私の場合はこのチュートリアルで説明されているものとは少し違って見えます。

私の場合、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 

は私がファイルシステムにアップロードされたファイルを保存して、データベースに対応するAssetモデルを作成するために、params[:assets]で何をすべき?

答えて

1

ファイルを保存するには、アセットモデルを作成し、添付ファイルをモデル(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 %> 
保存するときにも、それは子アセットモデルを受け入れても大丈夫だと自分のUserモデルを伝えるために必要があるだろう

def User 
    accepts_nested_attributes_for :assets 
end 
fields_forのループが動作するように

は、その後、あなたのコントローラのアクションで、あなただけのメモリ内にいくつかの新しい資産を構築したい:これは理にかなって

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

希望を。続ける - あなたはそこに着くだろう。

+0

お返事ありがとうございます!それは本当に私を助けました!私はファイルをアップロードしようとしているユーザーが誰であるかを事前に知っていないので、(チュートリアルで提案されているように)ユーザーのフォームでこれを実装することはできません。私は知っている、それは奇妙に聞こえるが、これはケースです:)いくつかの質問:**(1)** 'N'ファイルがアップロードされる場合は、' N '回を呼び出すのではなく、 「保存する」? **(2)**(ばかげた質問) 'user.assets.new'が何をしているか詳しく説明できますか? 'user.assets'は' Array'です。だからあなたは 'Array'で' new'を呼び出しますか?ところで、それは魅力のように動作します:) –

+0

1)あなたは資産を省略することができるかもしれません。行を保存し、最後にuser.saveを呼び出す - 私はチェックなしではわからない。それを試してみてください! –

+0

2)user.assetsは配列ではありません。配列を返すhas_manyアソシエーションによって作成されるメソッドです。 user.assets.newは、user_idが設定された新しいAssetオブジェクトを返す別のメソッドです。他のメソッドもあります:user.assets <<(asset)は新しいオブジェクトを割り当て、user.assets.sizeは関連オブジェクトの数のカウントを返します。完全なリストについては、http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_manyを参照してください。 –

関連する問題