繁体   English   中英

使用Laravel从提交的AJAX返回Flash消息以进行验证和成功

[英]Returning a flash message for validation and succes from AJAX from submission using Laravel

经过研究后,我对使用JSON有所了解,但是我不确定流程。 下面的代码是我的AJAX控制台日志after.done当前不起作用,但是当我成功作为AJAX对象的一部分时它正在起作用。

AJAX

      $(document).on('click', '#button', function() {
      var wrap = $(this).closest('div.form_wrap');
      wrap.find('form').each(function() {

          var id = $(this).prop('id');
          var arr = jQuery.makeArray( "#"+id );
          var url = $(this).attr('action');
          var type = $(this).attr('method');
          var i = $('#'+id); // Or just $(this)
          var data = i.serialize();

    // setup on submit 
          i.submit(function(event) {
        event.preventDefault();
        var formElem = $(event.currentTarget);

    console.log(data);
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

              $.ajax({
                  type        : type, 
                  url         : url, 
                  data        : data,
                  dataType    : 'json',
                  encode      : true
                })
                  .done(function(data) {              
                      console.log(data);         
                  });     
        });

        i.submit();
      });
        });

控制者

public function store(Request $request)
    {

        //validate
        $this->validate($request, array (
            //'exercise' => 'required|unique:workout_goals,user_id,NULL,id,exercise,'.$request->exercise,
            //'reps' => 'required|integer',
            //'exercise' => 'required|unique:workout_goals,exercise,NULL,id,user_id,'.$request->user_id,          
        ));

        //store
        $post = new workout_shared;
        $post->date = $request->date;
        $post->user_id = $request->user_id;
        //$post->shared_id = $request->shared_id;
        $post->exercise = $request->exercise;
        $post->weight = Input::get( 'weight' );
        $post->reps = $request->reps;
        $post->sets = $request->sets; 

        //save
        $post->save();


        //session flash message
        Session::flash('success','Workout shared!');

        //redirect


        return back();
    }

谢谢

$ .done将仅在成功的ajax调用之后被调用,因此您在调用该URL时可能会收到错误。 使用$ .fail捕获此错误:

$.ajax(...)
 .done(function(){ console.log("Done!"); })
 .fail(function(jqXHR, textStatus, errorThrown){ 
    console.log("Fail!", jqXHR, textStatus, errorThrown); 
 });

设置一个Session :: flash()将在下一个http请求的会话中存储此消息,要检索此消息,请在显示的下一页上使用此消息:

Session::pull(...)

但是,当您使用ajax进行调用时,您将需要像所说的那样将消息作为JSON返回。 我还建议使用类似方法来处理您的save方法,然后根据该方法的调用方式来实现即插即用消息或json:

...

// Save 
$result = $post->save(); // return a boolean for success/fail
$message = $result ? "Workout shared!" : "Workout sharing failed!";

// Response
if ($request->ajax())
{
    // Ajax response, will translate to JSON
    return new Array(
       'Success' => $result,
       'Message' => $message
    );
}

// Regular Http response
Session::flash('save-response', $message);

// Redirect
...

进一步的步骤是将这段代码的整个响应部分提取到一个新方法中,然后在验证后也可以使用它,例如:

WorkoutSaveResponse($result, $message)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM