🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1433閲覧

Vue.js + Rails6 axiosを使ってcreateメソッドを実行したい

kazumo24

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/03/24 12:32

編集2021/03/25 08:10

前提・実現したいこと

夢日記投稿アプリをの投稿機能を実装中
axiosを用いて、API通信を行いcreateメソッドを実行したいです。
コンソール上で404エラーが返されます。
修正した結果コンソール上で500エラーが返されるようになり、ターミナル上では
Unpermitted parameter: :dream
が表示されまですが、dreamというパラメーターは使う予定はなく、どこから来てしまっているのか不明です。このdreamというパラメーターを送信されないようにするためにはどうすればよいでしょうか。

パラメーターはtitle,discription,nameの3つで、フォームオブジェクトモデルを使用し、titleとdiscriptionはdreamsテーブルへ、nameはTagsテーブルへ保存される仕様としています。

発生している問題・エラーメッセージ

console

1Error: Request failed with status code 500 2 at createError (createError.js?2d83:16) 3 at settle (settle.js?467f:17) 4 at XMLHttpRequest.handleLoad (xhr.js?b50d:62)
#ターミナルのエラーメッセージ web_1 | NoMethodError (undefined method `create' for DreamsTag:Class): web_1 | web_1 | app/controllers/dreams_controller.rb:8:in `create' web_1 | Started POST "/dreams" for 172.18.0.1 at 2021-03-25 07:58:11 +0000 web_1 | Processing by DreamsController#create as HTML web_1 | Parameters: {"title"=>"ああああ", "name"=>"ああああ", "discription"=>"あああ", "dream"=>{"title"=>"ああああ", "discription"=>"あああ"}} web_1 | Unpermitted parameter: :dream web_1 | Completed 500 Internal Server Error in 6ms (Allocations: 938) web_1 | web_1 | web_1 | web_1 | NoMethodError (undefined method `create' for DreamsTag:Class):

該当のソースコード

#App.vue <template> <div id="app"> <header> <img alt="Header logo" src="./assets/header-logo.png" height="80"> </header> <a class="index-btn btn-pink" @click="openModal">夢を登録する</a> <div id="overlay" v-if="modal"> <div id="content"> <p>夢の記録しよう!</p> <input class="title-input" v-model="title" placeholder="夢のタイトルを入力"> <input class="tag-input" v-model="name" placeholder="タグを入力"> <div> <textarea class="discription-input" v-model="discription" placeholder="夢の内容を入力" cols="50" rows="10"></textarea> </div> <div class="button-wrapper"> <a class="modal-btn btn-pink" @click="closeModal">Close</a> <a @click="createDream" class="modal-btn btn-pink"> <span> 登録する </span> </a> </div> </div> </div> </div> </template> <script> import axios from 'axios'; export default { name: 'App', components: { }, data(){ return { dreams: [], modal: false, title: this.title, name: this.name, discription: this.discription } }, methods: { openModal() { this.modal = true }, closeModal(){ this.modal = false }, getDream(){ axios.get('http://localhost:3000/dreams') .then(res => (this.dreams = res.data)) .catch(err => { console.log(err) }) }, createDream(){ axios.post('http://localhost:3000/dreams',{ title: this.title, name: this.name, discription: this.discription }) .then(function (response){ console.log(response); }) .catch(function (error){ console.log(error); }); } } } </script> <style> ~略~ </style>
#controller class DreamsController < ApplicationController def index dreams = Dream.all.order(created_at: :desc) render json: dreams end def create @dreams = DreamsTag.create(dream_params) render json: @dreams end private def dream_params params.permit(:title, :discription, :name) end end
#DreamTagsModel class DreamsTag include ActiveModel::Model attr_accessor :title, :discription, :name with_options presence: true do validates :title validates :discription validates :name end def save dream = Dream.create(message: message, discription: discription) tag = Tag.create(name: name) DreamTagRelation.create(dream_id: dream.id, tag_id: tag.id) end end

試したこと

https://qiita.com/tatsurou313/items/4f18c0d4d231e2fb55f4
上記の記事を参考にしました。
input tagのtypeを指定したが動作に変化なし
formタグが不要とのことでしたので、フォームを省きましたが変化なし、
他に何か原因はございますでしょうか。

お力添えの方、よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

ruby2.6.5
rails 6.1.3
"vue": "^3.0.0",
"vue-axios": "^3.2.4"
"axios": "version": "0.21.1",

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらく必要なパラメータがないか、認められていないパラメータが含まれているのではないでしょうか。

<form @submit.prevent なのでパラメータが渡っていない可能性があるのではないでしょうか? Rails側のログをみれば何かわかるのでは。
def dream_params params.require(:dreams_tag).permit(:title, :discription, :name) end
axios.post('https://xxxxx/createDream', { title: 'test', discription: 'abc', name: 'hoge' })

とかでテストしてみたらどうでしょうか?

投稿2021/03/24 19:42

編集2021/03/24 19:46
gambaldia

総合スコア266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazumo24

2021/03/25 06:00 編集

gambaldia様 ご回答ありがとうございます。 ご提案頂いたコードでテスト送信を行った結果 ``` #ターミナルのrailsログ web_1 | Started POST "/dreams" for 172.18.0.1 at 2021-03-25 05:44:04 +0000 web_1 | Processing by DreamsController#create as HTML web_1 | Parameters: {"title"=>"test", "discription"=>"abc", "name"=>"hoge", "dream"=>{"title"=>"test", "discription"=>"abc"}} web_1 | Completed 400 Bad Request in 0ms (ActiveRecord: 13.6ms | Allocations: 110) web_1 | web_1 | web_1 | web_1 | ActionController::ParameterMissing (param is missing or the value is empty: dreams_tag): web_1 | web_1 | app/controllers/dreams_controller.rb:14:in `dream_params' web_1 | app/controllers/dreams_controller.rb:8:in `create' ``` ``` #consoleのエラーログ POST http://localhost:3000/dreams 400 (Bad Request) dispatchXhrRequest @ xhr.js?b50d:177 xhrAdapter @ xhr.js?b50d:13 dispatchRequest @ dispatchRequest.js?5270:52 Promise.then (async) request @ Axios.js?0a06:61 Axios.<computed> @ Axios.js?0a06:87 wrap @ bind.js?1d2b:9 createDream @ App.vue?3dfd:69 $data.modal.Object.onClick._cache.<computed>._cache.<computed> @ App.vue?3dfd:24 callWithErrorHandling @ runtime-core.esm-bundler.js?5c40:154 callWithAsyncErrorHandling @ runtime-core.esm-bundler.js?5c40:163 invoker @ runtime-dom.esm-bundler.js?830f:308 createError.js?2d83:16 Uncaught (in promise) Error: Request failed with status code 400 at createError (createError.js?2d83:16) at settle (settle.js?467f:17) at XMLHttpRequest.handleLoad (xhr.js?b50d:62) ``` パラメーターがうまく渡っていないようです... railsログの方のパラメーターの内容においてdreamという値が重複して入ってしまいます。恐らくこのdreamがUnpermitなためエラーがでていると考えられますが、このdreamがなぜでてきているかが不明です。 この値を消すにはどう修正すればよろしいでしょうか...。
gambaldia

2021/03/25 08:26

パラメータの渡し方が間違ってましたね。すみません。 { dream: this.dream } かな? Hashそのものではなく、HashのHashを渡すのだと思います。Rails詳しくないのですみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問