0

Rails 4.2.3 と「:remote => true」プロパティを使用して、フォームをリモートで送信しています。ただし、戻ってくる検証エラーを表示するのに問題があります。私のコントローラーには

  def create
    @my_object = MyObject.new(my_object_params)
    @current_user = User.find(session["user_id"])
    @my_object.user = @current_user
    @date = Date.strptime(my_object_params[:day], "%m/%d/%Y")
    @my_object.day = @date
    respond_to do |format|
      if @my_object.save
        flash[:notice] = 'Saved successfully'
        format.html { redirect_to controller: "users", action: "index", notice: 'Saved successfully.' }
        format.js { render js: "window.location='/users'" }
      else
        format.html { render action: "index" }
        format.json { render json: @my_object.errors, status: :unprocessable_entity }
        format.js { render json: { error: @my_object.errors, success: false }, content_type: 'application/json' }
      end
    end
  end

そして、私のコーヒースクリプトには、

$(document).ready (data) ->
  $("#add_form").bind "ajax:error", (xhr, status, error) ->
    console.log(xhr) 
    console.log(status)
    console.log(error)
    render_form_errors(xhr, error)
    #Give an alert message
  $("#add_form").bind "ajax:before", (evt, data, status, xhr) ->
    hrs = $('#my_object_hour').val();
    min = $('#my_object_minute').val();
    sec = $('#my_object_second').val();
    $('#my_object_my_object_times_attributes_0_time_in_ms').val((hrs * 60 * 60 + min * 60 + sec) * 1000);

しかし、「xhr、status、error」の 3 つのフィールドのいずれにも JSON エラーが含まれていません。console.log ステートメントの出力は次のとおりです。

j…y.Event {type: "ajax:error", timeStamp: 1465418664628, jQuery112103593207809583596: true, isTrigger: 3, namespace: ""…}
users.self-a27ba2c….js?body=1:13 Object {readyState: 4, responseText: "ArgumentError in MyObjectsController#create↵↵invalid d…VER_PROTOCOL: "HTTP/1.1"↵↵Response headers↵None↵↵", status: 500, statusText: "Internal Server Error"}
users.self-a27ba2c….js?body=1:14 error

これらをコントローラーから送信するにはどうすればよいですか?

ありがとう、 -

編集:回答に応じて、指定された方法でコントローラーを編集し、これをコーヒースクリプトに追加しました...

$(document).ready (data) ->
  $("#add_form").bind "ajax:failure", (e, xhr, status, error) -> 
    console.log('error');
    console.log(e);
    console.log(xhr);
    console.log(status);
    console.log(error);
    render_form_errors(xhr, error)  
  $("#add_form").bind "ajax:error", (xhr, status, error) ->
    console.log(xhr)
    console.log(status)
    console.log(error)
    render_form_errors(xhr, error) 
    #Give an alert message
  $("#add_form").bind "ajax:before", (evt, data, status, xhr) ->
    hrs = $('#my_object_hour').val();
    min = $('#my_object_minute').val();
    sec = $('#my_object_second').val();
    hrs_in_ms = hrs * 60 * 60 * 1000
    min_in_ms = min * 60 * 1000
    sec_in_ms = sec * 1000
    ms = hrs_in_ms + min_in_ms + sec_in_ms
    alert(ms)
    $('#my_object_my_object_times_attributes_0_time_in_ms').val(ms);

しかし、エラーのあるフォームを送信すると、上記のどれも呼び出されません。「if @my_object.save」の「else」句が呼び出されているのを(デバッグを通じて)確認できるため、エラーがあることはわかっています。

4

1 に答える 1

1

まず、その 500 エラーを修正する必要があります。例を挙げていませんが、これは大まかな例です。

bugs.js

$(document).ready(function() {
  console.log('hiii');
  $('#new_bug')

  .on('ajax:success', function(e, data, status, xhr) {
    console.log('success');
    console.log(e);
    console.log(data);
    console.log(status);
    console.log(xhr);
  })

  .on('ajax:error', function(e, xhr, status, error) {
    console.log('error');
    console.log(e);
    console.log(xhr);
    console.log(status);
    console.log(error);
  })
})

たとえば、私のコントローラーは bugs_controller.js

  def create
    @bug = Bug.new(bug_params)

    respond_to do |format|
      if @bug.save
        format.html { redirect_to @bug, notice: 'Bug was successfully created.' }
        format.json { render :show, status: :created, location: @bug }
        format.js { render json: { success: true, bug: @bug.to_json }, content_type: 'application/json' }
      else
        format.html { render :new }
        format.json { render json: @bug.errors, status: :unprocessable_entity }
        format.js { render json: { error: @bug.errors, success: false }, content_type: 'application/json' }
      end
    end
  end

else ブロックのコールバックが必要な場合ajax:errorは、400、500 などの別のステータス コードを提供する必要があります format.js { render json: { error: @bug.errors, success: false }, content_type: 'application/json', status: 500 }。検証エラーはあなたajax:successが処理します。また、合格しているためsuccess: false、js に検証エラーがあるかどうかを確認できます。

于 2016-06-18T10:12:23.457 に答える