5

jQuery フォーム プラグインをファイル アップロード フィールドで適切に動作させるのに少し問題があります。プラグインを使用してファイル アップロード フィールドなしでフォームを送信するformat.jsonと、ブロックの一部がrespond_to do |format|適切に呼び出されます。ただし、file-upload フィールドを追加することでformat.html、javascript コードにエラーが発生したと思わせる部分のみが実行されます。

プラグインが常にjsonを使用するように強制する方法を知っているか、これに遭遇した人はいますか? または、Rails に json を強制的にレンダリングさせるためにプラグインが使用する URL を変更できますか?

助けてくれてどうもありがとう!以下のコード:

# app/controllers/details_controller.rb
def create
  @detail = Detail.new(params[:detail])

  style = params[:detail_style].to_sym || :thumb
  data = { :id => '5', :url => 'test.rails' }

  respond_to do |format|
    if @detail.save
      flash[:notice] = 'Your image has been saved.'
      data = { :id => @detail.id, :url => @detail.data.url(style) }

      format.html { redirect_to :action => 'index' }
      format.json { render :json => "<textarea>#{data.to_json}</textarea>", :status => :created }
    else
      format.html { render :action => 'new' }
      format.json { render :json => @detail.errors, :status => :unprocessable_entity }
    end
  end
end

/* app/views/sidebar/_details.html.erb (excerpt) */

<% form_for(Detail.new, :html => { :multipart => true } ) do |f| %>
  <%= hidden_field_tag 'detail_style', 'thumb' %>

  <%= f.label :image, "Recent Images" %>
  <%= f.file_field :image%>

  <p> 
    <%= f.submit "Upload" %>
  </p>
<% end %>

<script>
$(document).ready(function() {
  var options = {
    dataType: 'json',

    success: function(json, statusText) {
      console.log("success: " + json);
    },

    error: function(xhr, statusText, errorThrown) {
      console.log("error: " + xhr.responseText);
    }
  };

  $('#new_detail').ajaxForm(options);
});
4

5 に答える 5

7

JSON応答を使用したファイルのアップロードでjQueryFormプラグインを機能させるには、いくつかのことが必要です。javascriptでは、.ajaxFormのオプションは次のようになっている必要があります。

dataType: 'json', // evaluate return as JSON

ブラウザは、コンテンツをJSONとして返すようにRailsアクションに指示する必要があります。これを行う1つの方法は、ファイルアップロードフォームテンプレートに非表示の形式の入力フィールドを追加することです。

<%= hidden_field_tag 'format', 'json' %>

Railsアクションは、respond_toブロック内でformat.jsonメソッドを実行します。

サーバーアクションで

  • JSONをタグにカプセル化すると、.ajaxFormは文字列をアンラップし、JSONを正しく評価します
  • リターンコンテンツタイプを「text/html」に設定します。そうしないと、一部のブラウザ(Firefox)がリターンをファイルにダウンロードしようとします。

例えば

  respond_to do |format|
    format.json {
          render :json => "<textarea>#{data.to_json}</textarea>", :content_type => "text/html"
    }
  }
于 2010-09-17T17:59:55.507 に答える
2

この問題の回避策を実行しました。このソリューションは Rails 3 でのみテストしましたが、2.3.x でも機能する可能性があります。

解決策は非常に簡単です。

!#javascript

$('form#my_form').live('submit',function(){ 
 $(this).ajaxForm({ dataType: "script", success: processJson})
 return false;
})

//data arrive as a string but we can parse it correctly

function processJson(data, statusText, xhr, $form){
 my_data_parsed = JSON.parse(data); 

  }

!#ruby 
def create
....   
render :js =>  { :status => false,:messages => @myobject.errors.full_messages}.to_json 

end 
于 2011-01-26T18:52:39.113 に答える
1

サーバーへの投稿を firebug で調べて、ここにリクエスト ヘッダーを貼り付けてください。Accept ヘッダーが json に設定されていることを確認します。また、どのバージョンのレールを使用していますか?

于 2010-02-09T15:58:34.777 に答える
1

なぜうまくいかないのかはまだわかりませんが、いろいろ試してみて、ようやく解決策を見つけました。

.jsonRailsにブロックのレンダリングを強制する末尾に追加してURLを変更しようとしformat.jsonましたが、ファイルをダウンロードしたいと思わせてブラウザを混乱させました。

それで、?format=json残念ながらまったく同じことをしたパラメータを渡してURLを変更しようとしました。

最終的に、format.jsonを単にformat.js(Javascript)に変更.jsして URL に追加しようとしましたが、render :json => ...以前と同じものを使用dataTypeして、jQuery 呼び出しでパラメーターを に設定しましたjson。これは、最適なソリューションではありませんが、機能しているように見えます。

他の誰かがこれが役立つことを願っています。適切な答えが見つかったら、再度投稿します。それまでの間、他の誰かが適切な答えを持っている場合は、私に知らせてください。あなたの答えを受け入れます!

于 2010-02-11T02:54:49.950 に答える
1

どうやら、ajaxSubmit を使用してファイルをアップロードする場合、Accept ヘッダーを設定することはできません。

このスレッドの malsup の回答を参照してください

彼は言い​​ます:

ファイルのアップロードは ajax を使用しません。フォーム プラグインはそのように表示するだけです。ファイルのアップロード時に、真のブラウザ送信が行われます。

于 2010-05-30T09:12:51.487 に答える