Laravel中ajax的基本用法

时间:2015-02-07 13:36:02

标签: jquery ajax laravel

我正在开发一个问答网站,我希望能够在不刷新页面的情况下提交问题的答案。我使用ajax但是我点击提交按钮没有任何反应。

这是我的表格。我知道它非常混乱;)

{{Form::open(array('method' => 'POST', 'class' => 'post_ans','action' => 'QuestionController@post_answer','style'=>'display:'.$textarea_display))}}
<textarea name="answer_content" rows="12"></textarea>
{{$errors->first('answer_content')}}
<input type="hidden" name="this_question" value="{{$question[0]->question_id}}">
<input type="submit" id="post_answer" value="Добави">

{{Form::close()}}

我的路线:

Route::post('/question','QuestionController@post_answer');

控制器:

public static function post_answer()
        {
            $data=Input::all();
            return Answer::postAnswer($data);
        }

jquery代码:

$('form.post_ans').on('submit',function(event){
        event.preventDefault();
        var data={
        this_question:$('#this_question').val(),
        answer_content:$('#answer_content').val()
    };

    console.log(data);
    var url= $(this).attr('action');
    console.log(url);
    $.ajax({
        type:"POST",
        url:url,
        data:data
    }).done(function(){
        console.log("success!");
    }).fail(function(){
        console.log('fail');
    }).always(function(){
        console.log("always");
    });

    });

模特:

public static function postAnswer($data)
        {
            $rules=array(
                'answer_content'=>'required'
            );

            $messages=array(
                'answer_content.required'=>'Това поле е задължително'
            );

            $validator=Validator::make($data, $rules, $messages);

            if($validator->fails())
            {
                return Redirect::to('/question/'.$data['this_question'])->withErrors($validator);
            }
            else
            {
                $date=date('d.m.Y');
                $poster=Session::get('user_logged');
                DB::table('answers')->insert(array(
                    'to_question'=>$data['this_question'],
                    'content'=>$data['answer_content'],
                    'date'=>$date,
                    'class'=>0,
                    'subject'=>'undefined',
                    'likes'=>0,
                    'best_answer'=>'false',
                    'by'=>$poster
                ));

                DB::table('questions')->where('question_id',$data['this_question'])->increment('answers');
                return Redirect::to('/question/'.$data['this_question']);
            }

        }

这就是我在控制台中得到的结果:

enter image description here

在模型中,我不确定在存储数据后该怎么做,所以我只是重定向到同一页面。

1 个答案:

答案 0 :(得分:1)

问题

首先,如果您查看屏幕截图,this_question对象的data属性为undefined,这就是 QuestionController 的方式其中使用$data['this_question']进行重定向。看看它是如何工作的?检查表单中的隐藏字段,因为这是设置this_question的位置:

<input type="hidden" name="this_question" value="{{$question[0]->question_id}}">

另外,检查jQuery选择器中的data对象。您使用$('#...')作为ID,但我不会在表单中看到包含这些ID的元素。

的Ajax

其次,由于用户体验,Ajax的标志是不进行任何重新加载(或重定向)。如果您需要重定向,您希望保留Ajax,正确的方法是通过JavaScript,.done()方法 - 使用window.location.href或{{1} }。

要在window.location.reload(true)方法中获得结果,您需要从 QuestionController 向JS脚本返回一些内容。因此,您可以执行类似的操作,而不是重定向:

.done()

之后您将收到return Response::json(true); 的回复:

.done()

通常,考虑是否为表单使用Ajax是重要的还是合理的。然后将您的代码重构为上面显示的内容,或者忘记Ajax并使用重定向生成标准表单提交。

知识

祝你好运。