起きている問題
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>)>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/07 07:12
2021/02/07 07:36