使用Laravel从AJAX返回验证和成功的flash消息


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

在做研究后,我的理解是使用JSON,但我不确定的过程。下面的代码是控制台日志之后的AJAX。done目前不工作,但是当我成功地作为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时可能会收到错误。使用美元。无法捕获此错误:

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

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

Session::pull(...)

然而,当你用ajax调用时,你需要像你说的那样返回JSON消息。我也会推荐一些沿着这条线来处理你的保存方法,然后实现flash消息或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)