【问题标题】:vue.js and laravel 5.2, storing data to dbvue.js 和 laravel 5.2,将数据存储到 db
【发布时间】:2016-04-20 02:03:16
【问题描述】:

--编辑--

这是现在的工作代码,将其用作您的请求的工作示例,如果要进行任何修改,请发表评论。

--编辑--

我正在尝试构建一个简单的单页寻呼机,其中包含用于消息的联系表。 我对 Laravel 没问题,但对 Vue.js 不熟悉(之前一直在使用 jQuery)。

我在使用以下代码将数据保存到数据库时遇到问题。

我的表格:

{!! Form::open(['method' => 'POST', 'route' => 'contact', '@submit.prevent' => 'sendmessage']) !!}
<div class="form-group animated fadeIn">
    {!! Form::label('name','Name:',['class' => '']) !!}
    {!! Form::text('name', null, ['class' => 'form-control', 'placeholder' => 'Your name', 'v-model' => 'messageData.name']) !!}
</div>
<div class="form-group animated fadeIn">
    {!! Form::label('mail','E-mail:',['class' => '']) !!}
    {!! Form::text('mail', null, ['class' => 'form-control', 'placeholder' => 'Your e-mail', 'v-model' => 'messageData.mail']) !!}
</div>
<div class="form-group animated fadeIn">
    {!! Form::label('phone','Phone:',['class' => '']) !!}
    {!! Form::text('phone', null, ['class' => 'form-control', 'placeholder' => 'Your phone number', 'v-model' => 'messageData.phone']) !!}
</div>
<div class="form-group animated fadeIn">
    {!! Form::label('message','Message:',['class' => '']) !!}
    {!! Form::textarea('message', null, ['class' => 'form-control', 'placeholder' => 'Enter your message', 'v-model' => 'messageData.message']) !!}
</div>
<div class="form-group animated fadeIn">
    {!! Form::submit('Send message', ['class' => 'btn btn-default form-control bold-black']) !!}
</div>
{!! Form::close() !!}

路由(不太确定这个新的中间件网络是做什么的,将感谢链接):

Route::group(['middleware' => ['web']], function () {
    Route::post('/contact', ['as' => 'contact', 'uses' => 'MessageController@store']);
});

messageController中的Store方法:

public function store(MessageRequest $request)
{
    Message::create($request->all());
    $message = "Message sent succesfully.";
    return $message;
}

消息请求:

public function rules()
{
    return [
        'name' => 'required|min:3',
        'mail' => 'required|email',
        'phone' => '',
        'message' => 'required|min:10',
    ];
}

});

最后是 Vue 组件:

contact: {
    template: '#contact-template',

    data: function() {
        return {
            messageData: {
                name: null,
                mail: null,
                phone: null,
                message: null
            }
        }
    },

    methods: {
        sendmessage: function(messageData) {
            this.$http.post('contact', {messageData:messageData})
                    .then(function() {
                        console.log('success ');
                    })
                    .catch(function() {
                        console.log('error');
                    });
        }
    }
},

这是控制台日志:

POST http://localhost:8080/contact 500 (Internal Server Error)
(anonymous function) @ vue-resource.js:1182
Promise @ vue-resource.js:854
module.exports @ vue-resource.js:1150
module.exports @ vue-resource.js:781
(anonymous function) @ vue-resource.js:1213

error

我还没有在任何地方包含 csrf 令牌,所以这可能是问题所在。我正在为此积极努力,感谢您提供任何帮助。

编辑:

我已经解决了上面的问题: 我没有在标题中导入csrf_token,请将其添加到您的 html 文件的标题中:

<meta id="token" name="token" content="{{ csrf_token() }}">

另外,/ 路由应该转到web 中间件组:

Route::group(['middleware' => ['web']], function () {
    Route::get('/', function () {
        return view('welcome');
    });
    Route::post('/contact', ['as' => 'contact', 'uses' => 'MessageController@store']);
});

但是,我似乎没有发送任何数据来发布请求,因为无论我做什么都会得到输出:

{"name":["The name field is required."],"mail":["The mail field is required."],"message":["The message field is required."]}

这是我对消息模型的验证规则。

EDIT2:(这是最终版本,希望这可以帮助某人作为完整的工作示例,需要做的是在输入字段下添加错误。)

在 Vue 中的联系组件发送方法需要是这样的

        sendmessage: function(messageData) {
            this.$http.post('contact', {name:this.messageData.name,mail:this.messageData.mail,phone:this.messageData.phone,message:this.messageData.message})
                    .then(function() {
                        console.log('success ');
                    })
                    .catch(function() {
                        console.log('error');
                    });
        }

使其与MessageRequest 中的命名一起使用。

【问题讨论】:

  • 而不是function(){console.log('success')} function(response){console.log(response)} 说什么?
  • 那是我的错,我将所有错误重定向到/。修复了这个问题,现在我得到了Class App\Http\Controllers\MessageRequest does not exist 我会从这里开始,如果我卡住了,我会回来的,在调试 JS 方面不是很好。谢谢!
  • 太好了,现在您要查找的错误将在您的 Laravel 日志中(因为它显示服务器错误)所以这不是 vue 问题
  • @Jeff 我解决了大部分问题,但我相信现在我被 Vue 困住了,没有将数据传递给 post 请求。
  • 在您的 post 请求中将 {messageData:messageData} 更改为 {messageData:this.messageData},并从 sendmessage 方法中删除 messageData 作为参数。

标签: laravel vue.js


【解决方案1】:

正如最后一个花絮,如果你这样做了,你不需要做name:this.messageData.name的事情:

sendmessage: function(messageData) {
        this.$http.post('contact', this.messageData)
                .then(function() {
                    console.log('success ');
                })
                .catch(function() {
                    console.log('error');
                });
    }

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2017-10-25
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-09-05
    • 2016-09-01
    • 2018-07-23
    • 2020-10-21
    相关资源
    最近更新 更多