0

ファイルをアップロードするための非常に単純な構成があります。説明付きで画像をデータベースにアップロードしたいだけです(知っています、知っています...)。それでおしまい。

これが私のモデルの外観です(ここから学びました)。attr_protected基本的には、 Rails 3.2 を動作させるための行のみを使用して、例のセットアップとまったく同じ方法です。

Photo < ActiveRecord::Base
  # note: there is also a :description attribute!!
  attr_protected :file_name, :content_type, :binary_data
  def image_file=(input_data)
    self.file_name input_data.original_filename
    self.content_type = input_data.content_type.chomp
    self.binary_data = input_data.read
  end
end

私の非常に単純なビューは次のようになります。

<h1>New Photo</h1>

<%= form_for(@photo) do |f| %>

  <fieldset>
    <legend>Upload a Photo</legend>

    <div class="control-group">
      <label class="control-label">Photo</label>
      <div class="controls">
        <%= f.file_field :image_file %>
      </div>
    </div>

    <div class="control-group">
      <%= f.label :description, class: "control-label" %>
      <div class="controls">
        <%= f.text_field :description, class: "text_field" %>
      </div>
    </div>

    <div class="form-actions">
      <%= f.submit "Upload", class: "btn btn-primary" %>
      <%= link_to "Cancel", photos_path, class: "btn" %>
    </div>
  </fieldset>

<% end %>

そして最後に (単に完全を期すために)、ここに私の作成アクション (単純な足場) があります。

def create
  @photo = Photo.new(params[:photo])

  respond_to do |format|
    if @photo.save
      format.html { redirect_to @photo, notice: 'Photo was successfully created.' }
      format.json { render json: @photo, status: :created, location: @photo }
    else
      format.html { render action: "new" }
      format.json { render json: @photo.errors, status: :unprocessable_entity }
    end
  end
end

/photosアイデアは、ユーザーがファイルを選択し、コントローラーの「作成」メソッドに投稿する必要がある簡単な説明を入力することです。残念ながら、送信ボタンをクリックすると、実際の問題が何であるかについての情報が得られない非常に漠然としたエラーが表示されます。

ArgumentError in PhotosController#create

wrong number of arguments (1 for 0)
Rails.root: /Users/me/dev/photo-app

Application Trace | Framework Trace | Full Trace
app/models/photo.rb:4:in `image_file='
app/controllers/photos_controller.rb:43:in `new'
app/controllers/photos_controller.rb:43:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"qSjMHgjCDo2ORmTvnujrljfPCj6oekLI9KAz4x5gA7Q=",
 "photo"=>{"image_file"=>#<ActionDispatch::Http::UploadedFile:0x00000101726fd0 @original_filename="SomePic.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"photo[image_file]\"; filename=\"SomePic.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/kc/8hsmx29j3xn2_j_9tsw8bz6w0000gn/T/RackMultipart20121001-52387-lre7zh>>,
 "description"=>"my description"},
 "commit"=>"Upload"}

私はGoogleとStackOverflow全体を見てきましたが、私の(非常に単純な)例と一致するものはないようです. どんな助けでも大歓迎です!

前もって感謝します!

4

2 に答える 2

1

ここで、image_fileにはActionDispatchオブジェクトのみが含まれ、ファイルの内容と説明は含まれていません。

"image_file" => #<ActionDispatch::Http::UploadedFile:0x00000101726fd0 original_filename="SomePic.jpg"

これは、ファイルをアップロードするためのばかげた方法に見えます。いずれにせよ、あなたは読むことによってあなたのアップロード場所にコンテンツを書く必要があります:tempfile

于 2012-10-01T19:01:22.763 に答える
0

@kiddorails のアドバイスを受けて、 Amazon Web ServiceとともにCarrierWaveを実装しました。私のプロジェクトでは画像のアップロードが必要で、Heroku に限定されていました。したがって、私は飛び込んでそれを理解しました。後から考えると、これが最善の解決策ですが、当時は私の (サンプル) プロジェクト アプリケーションにはやり過ぎのように思えました。これは、(「Ruby on Rails 以外の」開発者として) 私にとってはトリッキーでした。

結局のところ、画像をデータベースに保存したい人には、そうしないで、私と同じことをすることをお勧めします。正しいやり方を学びましょう。:)

于 2012-10-04T00:31:16.550 に答える