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

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

詳細はこちら
Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

574閲覧

Ruby on Rails フォームの内容が、DBに保存されない

mayuphoo

総合スコア13

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/02/07 04:18

起きている問題

Ruby on Railsで、記事の投稿サイトを作っています。

 現在は、createアクション・updateアクションにより、新規投稿と編集の機能を実装しているのですが、どちらもフォームで送信したデータがDBに保存されず、困っています。

具体的には、フォームのsubmitボタンを押すことはできるのですが、その後に設定してあるredirect_toの処理が実行されず、DBにも値が入っていない状況です。(新規投稿・編集どちらも)フォームは、create/updateの共通のフォームとして、_form.html.erbに切り出しています。

Parameterの確認や、フォームへの変数の受け渡しなどの確認をしましたが原因が解明できません。どなたかご教授いただけると、幸いです。

###エラーメッセージ

submitボタンを押しても、そのフォームのページが表示されたままで、エラーメッセージは何も出ません。

試したこと

・binding.pryにて、送信されたパラメーターを確認。
→ 問題なく内容が送信されてきていました。
また、ストロングパラメーター内にも、正しく値が送信されていました。

・バリデーションの記述にも誤りがないか確認。
・サーバーの再起動

該当のソースコード

●article_controller

class ArticlesController < ApplicationController before_action :find_article, only: [:show, :edit, :update, :destroy] # before_actionで、ログイン者かつid==1以外は[:new, :create,:edit, :update, :destroy ]が出来ないように設定する。 def index @articles = Article.order(created_at: :desc) end def show @like = Like.new end def new @article = Article.new end def create @article = Article.new(article_params) if @article.save redirect_to @article, notice:'投稿が完了しました' else render :new, alert:'投稿できませんでした' end end def edit end def update if @article.update(article_params) redirect_to @article, notice:'更新できました' else render :new, alert:'更新できませんでした' end end def destroy if @article.destroy redirect_to @article, notice:'削除が完了しました' else redirect_to root_path, alert:'削除できませんでした' end end private def find_article @article = Article.find(params[:id]) end def article_params params.require(:article).permit(:title, :body) end end

●new.html.erb

<div class="container"> <div class="col-md-12 margin-top-5per article-block"> <h1 class="text-center">ブログの新規作成</h1> <%= image_tag 'mafin.jpeg', class: 'article-image padding-top-15'%> <div class="padding-bottom-15"> <%= render 'form', article: @article %> </div> </div> </div>

●edit.html.erb

<div class="container"> <div class="col-md-12 margin-top-5per article-block"> <h1 class="text-center">ブログの編集</h1> <%= image_tag 'mafin.jpeg', class: 'article-image padding-top-15'%> <div class="padding-bottom-15"> <%= render 'form', article: @article %> </div> </div> </div>

●_form.html.erb

<%= form_with model:article do |f| %> <div class="form-group padding-top-15"> <%= f.label :title, 'タイトル' %> <%= f.text_field :title, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :body, 'コンテンツ' %> <%= f.text_area :body, rows: 10, class: 'form-control' %> </div> <%= f.submit class: 'btn btn-success' %> <% end %>

●article.rb

class Article < ApplicationRecord validates :title, presence: true validates :body, presence: true belongs_to :user has_many :likes, dependent: :destroy has_many :liked_users, through: :likes, source: :user end

●routes.rb

Rails.application.routes.draw do devise_for :users resources :users, only: :show resources :articles do resource :like, only: [:create, :destroy] end root "articles#index" end

(●createアクションにてbinding.pryをしたときのターミナルの様子)

Started POST "/articles" for ::1 at 2021-02-07 12:20:16 +0900 Processing by ArticlesController#create as JS Parameters: {"authenticity_token"=>"PnJLUH5y905RV9xsRMpA9gMurY9h/Lbirdi0OzEb3by8Fkr6di+R9IFO16Hz5dfdTZzyhqmNCdswLmuSMKyREQ==", "article"=>{"title"=>"料理の作り方", "body"=>"こうします。"}, "commit"=>"Create Article"} From: /Users/mayu/projects/cooking/app/controllers/articles_controller.rb:18 ArticlesController#create: 17: def create => 18: binding.pry 19: @article = Article.new(article_params) 20: if @article.save 21: redirect_to @article, notice:'投稿が完了しました' 22: else 23: render :new, alert:'投稿できませんでした' 24: end 25: end [1] pry(#<ArticlesController>)> params => <ActionController::Parameters {"authenticity_token"=>"PnJLUH5y905RV9xsRMpA9gMurY9h/Lbirdi0OzEb3by8Fkr6di+R9IFO16Hz5dfdTZzyhqmNCdswLmuSMKyREQ==", "article"=>{"title"=>"料理の作り方", "body"=>"こうします。"}, "commit"=>"Create Article", "controller"=>"articles", "action"=>"create"} permitted: false> [2] pry(#<ArticlesController>)> article_params => <ActionController::Parameters {"title"=>"料理の作り方", "body"=>"こうします。"} permitted: true>

(●updateアクションでbinding.pryをしたときのターミナルの様子)

Started PATCH "/articles/3" for ::1 at 2021-02-07 13:13:08 +0900 Processing by ArticlesController#update as JS Parameters: {"authenticity_token"=>"UivdVgaBmrYqfNP/uJRU3jvZ+G7k+0IsHf/hdlp1rWItvLkxZhH4Zzq7iuArHn0d6EFWzO7Z0fGtXrymiADbng==", "article"=>{"title"=>"から揚げ", "body"=>"定番柔らかサックリから揚げ"}, "commit"=>"Update Article", "id"=>"3"} Article Load (0.4ms) SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 3 LIMIT 1 ↳ app/controllers/articles_controller.rb:48:in `find_article' From: /Users/mayu/projects/cooking/app/controllers/articles_controller.rb:30 ArticlesController#update: 29: def update => 30: binding.pry 31: if @article.update(article_params) 32: redirect_to @article, notice:'更新できました' 33: else 34: render :new, alert:'更新できませんでした' 35: end 36: end [1] pry(#<ArticlesController>)> params => <ActionController::Parameters {"_method"=>"patch", "authenticity_token"=>"UivdVgaBmrYqfNP/uJRU3jvZ+G7k+0IsHf/hdlp1rWItvLkxZhH4Zzq7iuArHn0d6EFWzO7Z0fGtXrymiADbng==", "article"=>{"title"=>"から揚げ", "body"=>"定番柔らかサックリから揚げ"}, "commit"=>"Update Article", "controller"=>"articles", "action"=>"update", "id"=>"3"} permitted: false> [2] pry(#<ArticlesController>)> article_params => <ActionController::Parameters {"title"=>"から揚げ", "body"=>"定番柔らかサックリから揚げ"} permitted: true> [3] pry(#<ArticlesController>)>

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういう場合のためにどんなエラーで失敗しているのかを表示するようにしておきましょう。
belongs_to :user なのに user_id に値が入っていないのが原因です。
params.require(:article).permit(:title, :body).merge(user_id: current_user.id)
としてください。
current_user出ないならば、適切なuserを。

投稿2021/02/07 04:44

winterboum

総合スコア23567

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

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

mayuphoo

2021/02/07 07:12

ありがとうございます。 articlleテーブルにuser_idカラムを追加して、ストロングパラメーターにもuser_idを追加したところ、うまく動作させることが出来ました! これからは、アソシエーションによるカラムの設計もしっかり計画してからアプリの作成をしようと思います。 早急なご回答、本当に助かりました。 ありがとうございました。
winterboum

2021/02/07 07:36

エラーがなにか、を確認することも大事です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問