0

私は最近、この質問をしました: Javascript Form Submission ?

現在、フォームの送信後、 create.js.erbが最新のデータ (送信されたデータ) をロードしない理由を解明しようとしています。

データを再度送信すると、テーブルは最後から 2 番目のデータで更新されますが、絶対最新のデータではありません。

...どうして?

編集:

最新のコード -

カテゴリ コントローラー: クラス Admin::CategoriesController < Admin::AdminController ...

  def create
    @category = Admin::Category.new(params[:admin_category])
    # You can't retrieve the @categories before attempting to add new one. Keep at end of create method.
    @categories = Admin::Category.all
    respond_to do |format|
      if @category.save
        save_to_history("The category \"#{@category.name}\" has been created", current_user.id)
        format.json { render json: { html: render_to_string(partial: 'categories') } }
        # I've tried both the above and bellow
        #format.json { render json: { html: render_to_string('categories') } }
        format.html { redirect_to(admin_categories_url, :notice => 'Category was successfully created.') }
        format.xml  { render :xml => @category, :status => :created, :location => @category }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @category.errors, :status => :unprocessable_entity }
      end
    end

  end

  ...
end

Javascript:

<script type='text/javascript'>
  $(function(){
    $('#new_admin_category').on('ajax:success', function(event, data, status, xhr){
      $("#dashboard_categories").html(data.html);
    });
  });
</script>

解決した

@ PinnyM のメソッドを使用し、次のコードで create.json.erb ファイルを追加しました。

<% self.formats = ["html"] %>
{
  "html":"<%= raw escape_javascript( render :partial => 'categories', :content_type => 'text/html') %>"
}

私の作成方法を次のように変更しました:

def create
    @category = Admin::Category.new(params[:admin_category])

    respond_to do |format|
      if @category.save
        # You can't retrieve the @categories before attempting to add new one. Keep after save.
        @categories = Admin::Category.all
        save_to_history("The category \"#{@category.name}\" has been created", current_user.id)
        format.json 
        format.html { redirect_to(admin_categories_url, :notice => 'Category was successfully created.') }
        format.xml  { render :xml => @category, :status => :created, :location => @category }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @category.errors, :status => :unprocessable_entity }
      end
    end
  end

これが面倒な場合は、提案をしてください。

4

3 に答える 3

1

リモート (AJAX) 送信の成功コールバックを処理する必要があります。パラメーター (2 番目のdata引数) は応答を保持します。

$(function(){
  $('#new_category').on('ajax:success', function(event, data, status, xhr){
    eval(data);
  });
});

これを行う (そして危険な を回避するeval) ためのより良い方法は、単にパーシャルを返し、それをどうするかをコールバックに決定させることです。

# in create action
format.json { render json: { html: render_to_string('categories') } }

# in your js, run at page load
$(function(){
  $('#new_category').on('ajax:success', function(event, data, status, xhr){
    $("#dashboard_categories").html(data.html);
  });
});

アップデート

@RomanSpiridonovが書いたことに気づきました-彼は絶対に正しいです。新しいものを追加しようとする前に @categories を取得することはできません。行をメソッド@categories = ...の最後に移動します。create

また、Category モデルが名前空間化されていることに気付きました。これは、デフォルトのフォームid属性が「new_admin_category」のようなものである可能性が高いことを意味します。実際にどのようにレンダリングされているかを確認し、成功コールバックを登録するときに jQuery セレクターでその ID を使用する必要があります。

$(function(){
  $('#new_admin_category').on('ajax:success', function(...
于 2013-05-13T14:35:42.743 に答える
1

新しいカテゴリを保存する前に定義されたメソッド「create」のインスタンス変数 @categories。そのため、テンプレートで最新のカテゴリを受け取ることができません。私はあなたがそのようなものを書くことができると思います:

$("#dashboard_categories").append("<%= escape_javascript(render("category")) %>");

于 2013-05-13T14:55:07.450 に答える