2012-01-29 3 views
0

空の値を選択できるようにするアップロードフォームを作成しようとしています。その結果、別のアップロードプロセスが発生します。 (実際のクラス名は "class"に置き換えられました)2つのオプションを持つレール選択フォーム

私のアップロードフォームは、ユーザーが選択フォームを空白のままにすると、私は実行する最初のアップロードのアクションを自分の作成方法たいと考えている。ここ

<%= form_for @upload, :url => class_uploads_path(@uploader), :method =>    
:post, :html =>{ :multipart => true } do |f| %> 
<%= render "shared/error_messages", :target => @upload %> 

    <p>This media relates to...<br/> 
<%= select "upload", "class_id", Class.all.collect {|class| [class.name,class.id] }, {   
    :include_blank => true } %></p> 

    <p>Title:<br/> 
    <%= f.text_field :title %></p> 

<p>Description:<br/> 
    <%= f.text_area :description, :rows => 3 %></p> 

<p>File to upload:<br/> 
    <%= f.file_field :data %></p> 

    <p><%= f.submit 'Upload for review' %></p> 
    <% end %> 

であり、彼らがクラスを選択した場合、私は2番目のアップロードをしたいです走る

def create   
    upload_params = params[:upload] || params[:image] || params[:video] 
    @class = Class.find(upload_params[:class_id]) || nil 

    begin 
    if upload_params[:data] 
     file_name = upload_params[:data].original_filename 
     file_contents = upload_params[:data].read 
    end 
    rescue 
    @upload = Upload.new 
    flash[:error] = "Could not find upload file data. Please reselect file." 
    render :action => 'new' and return 
    end 

    begin 
    if @class.nil? 
      @upload = Upload.factory({ :file => file_contents, 
             :name => file_name, 
             :network => @uploader, 
             :title => upload_params[:title], 
             :description => upload_params[:description] }) 
    else 
     @upload = Upload.factory({ :file => file_contents, 
             :name => file_name, 
             :class => @class, 
             :network => @uploader, 
             :title => upload_params[:title], 
             :description => upload_params[:description] }) 
    end 
    @upload.save! 

私は、データベースに新しい列を追加しないようにしようとしています、異なるハッキングの数を試してみました。前もって感謝します。

+0

ご質問はありますか? –

+0

ユーザーが選択ボックスを空白のままにして、別のアップロード方法を実行する方法を教えてください。上記のアクションを作成すると、私は試して、もし.. else condition。ユーザーが選択ボックスからオプションを選択しなかった場合は、最初のものを実行します。 –

答えて

1

カイル空白のオプションを選択した場合、params [:class_id]は空の文字列にする必要があります。これを確認する必要があります - 開発ログを見て、クラスを選択したときと行っていないときの両方で、どのようなパラメータがコントローラメソッドに返されているかを確認します。

それが正しい場合:

class_id = params[:class_id] 
@class = Class.find(class_id.to_i) if class_id and not class_id.empty? 

gg_sが指摘したように、あなたが投稿したコードをリファクタリングのための部屋がたくさんあります。しかし、既存のコードを機能させたいだけなら、これは参考になるかもしれません。

将来的には、何かがうまくいかないときは、「動作するまでハッキングする」よりも、ログ/コンソール出力で詳細を確認してください。コントローラメソッドにロギングステートメントを追加し、変数の値を出力します。次にそれを試してみて、ログをもう一度見てメソッド内で何が起こっているかを確認します。

+0

@Kyle、これはあなたのために機能しましたか?それが助けられたならば、アップヴォートは高く評価されるだろう。 –

+0

私は頼んだものを手に入れました。私がそのclass_idを持つことに他の依存関係があるので、アップロードプロセス全体がまだ機能していません。 S3にファイルを保存する方法と関係があります。 –

0

両方のアップロードの唯一の違いが:class => @classのペアである場合、2つの別々のアクションを持つ必要はありません。

私は、次のを想定し:私たちはここにUploadオブジェクト(upload.rbモデル、uploads_controller.rbコントローラ)で作業している

  • Upload.factoryは、その結果、アップロードデータを処理し、フォーマットプロセッサ方法でありますファイルとメタデータを持つUploadオブジェクトを完成させます。

もしそうなら、そのコントローラロジックはすべてモデルに移動できます。インスタンス変数を使用してモデルにデータを渡します(列を追加するのではなく、attr_accessor経由)。 before_createフィルターをfactoryに叩いてください。保存する前にアップロードが処理されるようにしてください。

"データなし"エラーを処理する検証を使用します。

例を示します。 upload.rb@uploaderが未定義であることを

def create 
    upload_params = params[:upload] || params[:image] || params[:video] 

    @upload = Upload.new({ :form_data  => upload_params[:data], 
         :form_network  => @uploader, # <-- undefined! 
         :form_class_id => upload_params[:class_id], 
         :form_title  => upload_params[:title], 
         :form_description => upload_params[:description]}) 
    if @upload.save 
    redirect_to @upload 
    else 
    render :action => "new" 
    end 
end 

注:

before_create :factory # run your factory method before creating 

attr_accessor :form_data, :form_network, :form_title, \ # settable from controller 
       :form_description, :form_class_id 

validates :form_data, :presence => true, :on => :create, \ # fail if no data 
      :message => "No file data. Please reselect file." 

private 

def factory 
    file_name = self.form_data.original_filename 
    file_contents = self.form_data.read 
    class = Class.where(:id => self.form_class_id).first # returns Class or nil 
    # if class is nil, handle it however you need to here 
    # access self.form_network, self.form_title, self.form_description directly 

    # ... factory magic ... 
end 

今、あなたのコントローラは、こののように整頓することができます。

@upload.saveは、@uploadを検証します。ファイルデータが存在しない場合、saveは失敗し、newアクションに「データなし」というエラーメッセージが表示されます。そうでない場合、妥当性検査が成功すると、factoryが呼び出され、レコードが保存されます。

+0

あなたの答えをありがとう、私はそれを実装する時間がなかったが、あなたは正しいです。私はこれを私のモデルにまとめる必要があります。 –

関連する問題