1

ajaxを介してフォームを送信し、jqueryを介して設定しているいくつかの変数を含めようとしています。

/views/applications/_form.html.erb

<%= form_for(@application, :html => {:class => "organizer"}, :remote => true) do |f| %>
  // fields in here
<% end %>

/controllers/applications_controller.rb

  # PUT /applications/1
  # PUT /applications/1.json
  def update
    @application = Application.find(params[:id])
    p params[:xposition]     # these get set in jquery
    p params[:application]   # these get set in jquery
    respond_to do |format|
      if @application.update_attributes(params[:application])
        @curr_app = ApplicationField.last

        format.html { redirect_to @application, notice: 'Application was successfully updated.' }
        format.json { head :no_content }
        format.js { render action: "update" }
      else
        format.html { render action: "edit" }
        format.json { render json: @application.errors, status: :unprocessable_entity }
        format.js { render action: "update" }
      end
    end
  end

/assets/javascripts/applications.js

$('.organizer').submit(function() {

        var dataToSubmit = $(this).serialize();
        var field_values = [];
        var x_values = [];
        var y_values = [];

        // i add values to the arrays above here

        for(i = 0; i < field_values.length; ++i) {
            dataToSubmit += "&field_name="+field_values[i]+"&xposition="+x_values[i]+"&yposition="+y_values[i];
        }

        $.post($(this).attr('action'), dataToSubmit);   
    });

私の現在のコードでは、フォームが送信されると、フォームはコントローラーに直接送信され、jqueryコードの$ .post呼び出しは同じコントローラーを呼び出し、$。post呼び出しのデータでxpostionとypositionを渡します(これは私が欲しいもの)。

フォームだけが2回送信されないようにするにはどうすればよいですか?1回は送信ボタンがクリックされたらすぐにコントローラーを押して、もう1回は$ .post呼び出しから送信しますか?

:remote => trueを指定すると、フォームがコントローラーを直接呼び出さないようになりますか?

編集

:remote => trueがjqueryの$.postメソッドを使用してajaxリクエストを手動で送信せずにajaxリクエストを送信する場合、:remote => trueを使用して自動的に作成されるajaxリクエストと一緒に追加の変数を送信するにはどうすればよいですか?

編集

これが私のサーバーログからの抜粋です

Started PUT "/applications/3" for 127.0.0.1 at 2013-01-18 00:06:19 -0600
Processing by ApplicationsController#update as */*
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"3LOzuiL/PU6HypJ4OeN5H9yrX3Xyk0VT6XpcFYd1wY0=", "application"=>{"application_field_attributes"=>{"0"=>{"id"=>"8"}, "1"=>{"id"=>"9"}}}, "field_name"=>"aaa", "xposition"=>"0", "yposition"=>"0", "id"=>"3"}
  Account Load (0.3ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`subdomain` = 'localhost' LIMIT 1
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  Application Load (0.4ms)  SELECT `applications`.* FROM `applications` WHERE `applications`.`id` = 3 LIMIT 1


Started PUT "/applications/3" for 127.0.0.1 at 2013-01-18 00:06:19 -0600
Processing by ApplicationsController#update as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"3LOzuiL/PU6HypJ4OeN5H9yrX3Xyk0VT6XpcFYd1wY0=", "application"=>{"application_field_attributes"=>{"0"=>{"id"=>"8"}, "1"=>{"id"=>"9"}}}, "commit"=>"Submit", "id"=>"3"}
  Account Load (0.3ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`subdomain` = 'localhost' LIMIT 1
  User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  Application Load (0.4ms)  SELECT `applications`.* FROM `applications` WHERE `applications`.`id` = 3 LIMIT 1
4

2 に答える 2

1

デフォルトの動作を防止することで、 for が正常に送信されないようにすることができます。これを行うには、関数にイベント パラメータを追加して呼び出します.preventDefault()

$('.organizer').submit(function(e) {
        e.preventDefault();
        var dataToSubmit = $(this).serialize();
        var field_values = [];
        var x_values = [];
        var y_values = [];

        // i add values to the arrays above here

        for(i = 0; i < field_values.length; ++i) {
            dataToSubmit += "&field_name="+field_values[i]+"&xposition="+x_values[i]+"&yposition="+y_values[i];
        }

        $.post($(this).attr('action'), dataToSubmit);   
    });
于 2013-01-18T05:48:26.490 に答える
1

自分以外のすべてのハンドラーを停止することができます。これを試して:

$('.organizer').submit(function(e) {
  e.preventDefault(); // stops default behavior
  e.stopPropagation(); // prevents event bubbling
  // you code
  return false;
});
于 2013-01-18T06:19:07.487 に答える