0

ファイルのアップロードに固執しました。複雑なフォームを使用しています。ここにモデルがあります:

class Project < ActiveRecord::Base
  has_one :task
  accepts_nested_attributes_for :task
end

class Task < ActiveRecord::Base
  has_one :project
  accepts_nested_attributes_for :project
end

ここにビューがあります:

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

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

  <%= f.fields_for :task_attributes do |a| %>
    <div class="field">
        <%= a.label :name %><br />
        <%= a.text_field :name %>
        <%= form_tag 'project/upload', :multipart => true do %>
            <label for="file">Upload text File</label><%= a.file_field :path %>
        <% end %>
     </div>
  <% end %>

<% end %>

ここにコントローラーがあります:

class ProjectsController < ApplicationController
  def new
    @project = Project.new
    @project.build_task

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @project }
    end
  end

  def upload
    uploaded_io = params[:upload][:path]
    File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
      file.write(uploaded_io.read)
    end
  end

  def create
    @project = Project.new(params[:project])

    respond_to do |format|
      if @project.save
        format.html { redirect_to(@project, :notice => 'Project was successfully created.') }
        format.xml  { render :xml => @project, :status => :created, :location => @project }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @project.errors, :status => :unprocessable_entity }
      end
    end
  end
end

移行:

class CreateProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.integer :id
      t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :projects
  end
end

class CreateTasks < ActiveRecord::Migration
  def self.up
    create_table :tasks do |t|
      t.string :name
      t.integer :project_id
      t.string :path

      t.timestamps
    end
  end

  def self.down
    drop_table :tasks
  end
end

フォーム経由でタスクを使用して新しいプロジェクトを作成すると、データベースに両方のレコードがあります。データベースにタスク ファイル パスが表示されます。しかし、公開ディレクトリにファイルが表示されません。ファイルを公開ディレクトリに保存する方法がわかりません。

この問題を解決するのを手伝ってください!

4

1 に答える 1

1

html でネストされたフォームを使用することはできません。ネストされたフォームがあります。フォームを送信すると、データが 1 つのリクエストとしてサーバーに送信され、コントローラー内の 1 つのアクションが呼び出されます。あなたの場合、フォームの送信時に作成アクションが呼び出され、アップロードアクションは呼び出されません。

内側のフォームを取り除き、外側のフォームにマルチパートを追加します。あなたの場合はそれで十分です。

ファイルのアップロードを手動で処理するのはオーバーヘッドです。ペーパークリップまたはキャリアウェーブを使用することをお勧めします。とにかく、それはあなたの問題ではありません。

于 2013-04-12T11:47:08.790 に答える