laravelアプリをfly上でpostgreSQLと接続してデータをいじりたい
Q&A
Closed
解決したいこと
laravelアプリをfly.ioにデプロイしpstgreSQLと接続したい。
発生している問題・エラー
デプロイは成功。
マイグレーションもエラーなく終了。
データを保存するメソッドを実行するボタンを押すとエラー
該当するソースコード
<script>
export default {
data () {
return {
categories: [],
formContentsClass: 'createFormContents',
formLabelClass: 'createFormInputLabel',
formInputClass: 'createFormInput',
inputName: 'name',
inputCate: 'category',
inputPPB: 'pricePerBox',
inputSPB: 'snpPerBox',
inputImg: 'image',
submitName: '',
submitCate: '',
submitPPB: '',
submitSPB: '',
submitImg: '',
createdPrizes: [],
errors: [],
}
},
props: {
inputCategories: {},
},
methods: {
CreatePrize () {
if (!this.submitName || !this.submitCate || !this.submitPPB || !this.submitSPB) {
this.errors = [];
if (!this.submitName) {
this.errors.push('景品名を入力してください');
}
if (!this.submitCate) {
this.errors.push('カテゴリを入力してください');
}
if (!this.submitPPB) {
this.errors.push('箱単価を入力してください');
}
if (!this.submitSPB) {
this.errors.push('入り数を入力してください');
}
return false;
}
const url = 'http://localhost/create';
axios.post(url, {
name: this.submitName,
category: this.submitCate,
pricePerBox: this.submitPPB,
snpPerBox: this.submitSPB,
img: this.submitImg
}).then((response) => {
this.createdPrizes.push(
{
name: this.submitName,
category: this.submitCate,
pricePerBox: this.submitPPB,
snpPerBox: this.submitSPB
}
);
this.submitName =
this.submitCate =
this.submitPPB =
this.submitSPB =
this.submitImg = '';
}).catch((error) => {
console.log(error);
});
},
ImageToBinary (image) {
const reader = new FileReader();
const imgFile = image.target.files[0];
if (image) {
reader.readAsDataURL(imgFile);
} else {
this.submitImg = '';
};
reader.onload = () => {
this.submitImg = reader.result;
}
}
},
mounted() {
this.categories = JSON.parse(this.inputCategories);
}
}
</script>
<template>
<div id="createContainer">
<form method="post" action="https://localhost/create">
<div :class="formContentsClass">
<label :for="inputName" :class="formLabelClass">景品名:</label>
<input :id="inputName" :class="formInputClass" v-model='submitName' type="text" placeholder="30字以内"/>
</div>
<div :class="formContentsClass">
<label :for="inputCate" :class="formLabelClass">カテゴリ:</label>
<input :id="inputCate" :class="formInputClass" list="data-list" v-model='submitCate' type="text" placeholder="14字以内" />
<datalist id="data-list">
<option v-for='category in categories'>{{ category }}</option>
</datalist>
</div>
<div :class="formContentsClass">
<label :for="inputPPB" :class="formLabelClass">箱単価:</label>
<input :id="inputPPB" :class="formInputClass" v-model='submitPPB' type="number" min="0" />
</div>
<div :class="formContentsClass">
<label :for="inputSPB" :class="formLabelClass">入り数:</label>
<input :id="inputSPB" :class="formInputClass" v-model='submitSPB' type="number" min="0" />
</div>
<div :class="formContentsClass" v-if='false'>
<label :for="inputImg" :class="formLabelClass">画像:</label>
<input :id="inputImg" :class="formInputClass" @change='ImageToBinary($event)' type="file" />
<img :src='submitImg' />
</div>
</form>
<button @click='CreatePrize'>作成</button>
<ul v-if='errors'>
<li v-for='error in errors'>
{{ error }}
</li>
</ul>
<table border="1">
<colgroup>
<col width="40%">
<col width="25%">
<col width="25%">
<col width="10%">
</colgroup>
<tr>
<td colspan="5">作成された景品</td>
</tr>
<tr v-if='createdPrizes.length == 0'>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr v-for="(prize, index) in createdPrizes" :key=index>
<td>{{ prize.name }}</td>
<td>{{ prize.category }}</td>
<td>{{ prize.pricePerBox }}</td>
<td>{{ prize.snpPerBox }}</td>
</tr>
</table>
</div>
</template>
<style>
#createContainer {
margin: 2rem 1rem;
}
.createFormContents {
width: 25%;
margin: 0.5rem 0;
}
.createFormInputLabel {
display: inline-block;
text-align: right;
width: 35%;
}
.createFormInput {
width: 65%;
}
</style>
自分で試したこと
このページを参考にデプロイ。flyの仕様が変わったのか前半書いていることが違ったため
「fly上でLaravelアプリとデータベースを接続」
のところまでは参考程度に、その後は忠実に行いました。
エラーが出たためformのactionのhttpをhttpsに変えてみたり、.envファイルの中身を変えてみたりしましたがコネクション失敗、ホスト名を翻訳できませんでした等のエラーを行ったり来たりでした。
ほぼ独学でやっているため
「プロキシ?クラスタ?何それおいしいの?サーバ構築?MAMP設定の仕方調べてスタートボタンぽち〜」
レベルの知識しかありません。
原因究明に足りてない情報がありましたらお手数をおかけいたしますがコメントにて指示をお願いいたします。
また、理解はしたいため余裕がありましたら何が原因で起こるエラーなのか、どこがどういう悪さをしてエラーが起こっているかなど説明もつけていただけるとありがたいです。
解決法
コメントでおっしゃられている通りパスが間違っていました。
laravelのヘルパ関数のroute()でパスを調べ書き直すと解決しました。
次に出た500エラーはfly logsでログを確認したところ恐らくテーブルにupdated_atがないのにデータが送られてきているというエラーでした。調べるとlaravelはデフォルトでupdated_atなどを自動で保存する仕様のようです。
モデルに下のを記載で解決。試していないですがカラムを作成することでも解決するかも...?
publick $timestamps = false;