3

ユーザーが自分のマシンからcsvファイルを選択し、それをファイルフォルダーに保存できるようにする簡単なファイルアップロードフォームがあります。Carrierwaveを使用しようとしていますが、アプリはRubyonRailsで構築されています。

ファイルを保存しようとすると、「[POST]に一致するルートがありません」/ customers/new」というエラーが表示されます。

さまざまなコンポーネントがあります。

/new.html.erb

<%= form_for :dataload, :html => {:multipart => true}  do |f| %>

 <p>
   <%= f.file_field :file %>
 </p>
 <p><%= f.submit %></p>
<% end %>

/models/dataload.rb

class Dataload < ActiveRecord::Base
    attr_accessible :file_name, :request_user, :source
    mount_uploader :file, CustomerWarrantyUploader
end

* /uploaders/customer_warranty_uploader.rb *

class CustomerWarrantyUploader < CarrierWave::Uploader::Base
  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  def extension_white_list
   %w(csv)
  end

* Customers_controller.rb(新しいメソッド。これには何もしていません)*

  def new
    @customer = Customer.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @customer }
    end
  end

これが顧客のための現在のルートです

  resources :customers

さまざまな同様のアプローチを試したので、問題が何であるかはわかりません。アドバイスをいただければ幸いです。

4

3 に答える 3

3

その理由は、そのルートが実際には存在しないためです。Resourcesは、次のルートを作成します(http://guides.rubyonrails.org/routing.html)。

GET     /customers          index   display a list of all photos
GET     /customers/new      new     return an HTML form for creating a new photo
POST    /customers          create  create a new photo
GET     /customers/:id      show    display a specific photo
GET     /customers/:id/edit edit    return an HTML form for editing a photo
PUT     /customers/:id      update  update a specific photo
DELETE  /customers/:id      destroy delete a specific photo 

ご覧のとおり、POSTパスは/customersのみです。フォームを簡単に調整するだけでうまくいくはずです。次のようなものが機能するはずです。

<%= form_for :dataload, { :url => customers_path , :html => {:multipart => true} }  do |f| %>

編集:ユーザーコメントの結果として追加情報を追加します。

また、アップロードされたファイルを処理するために、コントローラーにロジックを追加する必要があります。基本的に、Railscastで、彼は「サイトの一部はすでに構築されています。ギャラリーを一覧表示するページと、各ギャラリーへのリンク、およびギャラリーの写真を表示するページがあります」と述べています。。これには、新しい編集ページも含まれているようです。彼のコントローラーからのコード(プロジェクトのソースコードから-http: //media.railscasts.com/assets/episodes/sources/253-carrierwave-file-uploads.z​​ip)は次のとおりです。

@gallery = Gallery.new(params[:gallery])

したがって、彼がファイルを追加したとき、彼はそれをモデルの属性として行ったので、彼が追加しなければならなかったのはattr_accessible :image、コントローラーが自動的に画像の処理を開始するようにするためのビットだけでした(同じパラメーターで取得されるため)。モデルの属性としてではなく、さまざまなパラメーター(:dataload)を使用しているため、現在の手法を使用して、彼が持っているよりも多くのコードを追加する必要があります。多分次の線に沿った何か:

@dataload = Dataload.create(params[:dataload])

あるいは:

@dataload = Dataload.process_uploaded_file(params[:dataload])

次に、関連する顧客作成ロジックを開始するためのprocess_uploaded_fileメソッドをに追加します...Dataload

まだ実際には処理されていないもう1つのことは、データにエラーがある場合に何が起こるかです。たとえば、アップロードされたファイルの10個のエントリのうち2個が無効なレコードを作成した場合、どうしますか(エラーをどのように表示しますか)。

于 2012-09-01T07:26:02.847 に答える
1

redirect_to :backそれはあなたのモデルにあると確信していますDataload。これはリダイレクトしている必要があります/customer/newが、同じHTTPアクションを維持している必要があります。つまり、のPOST代わりにGET、ルーティングエラーが発生します。

そこにリダイレクトを設定する必要はないと思います(リダイレクトはコントローラーの領域です)が、どこに配置しても、強制的に303ステータスコードが必要になる可能性がありますGET

redirect_to :back, :status => 303, alert: "your file is being processed"

ドキュメントから:

GETまたはPOST以外のXHRリクエストを使用していて、リクエスト後にリダイレクトする場合、一部のブラウザは元のリクエスト方法を使用してリダイレクトに従います。これにより、二重DELETEなどの望ましくない動作が発生する可能性があります。これを回避するには、GETリクエストを使用して追跡される303SeeOtherステータスコードを返すことができます。

于 2012-08-29T08:22:35.033 に答える
0

他のコントローラーを介してファイルを作成し、フォームで使用
accepts_nested_attributes_for :dataload, allow_destroy: true
および使用する必要がありfield_forます。また、 nested_formgemを使用することもできます

于 2012-09-04T05:19:30.877 に答える