記事投稿アプリを作成しています。
記事情報をフォームに入力して、submitを行うとルーティングエラーが発生します。
エラー内容
ActionController::RoutingError (No route matches [POST] "/articles/new")
モデルに@article
を渡しているので、内容が空なら自動的にcreate
アクションが実行されると思います。
ルーティングもコントローラーも設定できている(できていると思っている)ので、問題ないと思うのですが何が原因なのでしょうか。
ソースコード
_form.html.erb
html
1<%= form_with model: @article, local: true do |f| %> 2 <div class="form-group"> 3 <%= f.label "画像" %><span class="badge badge-info ml-3">必須</span> 4 <%= f.file_field :image, class: "form-control-file" %> 5 </div> 6 7 <div class="form-group"> 8 <%= f.label "タイトル" %><span class="badge badge-info ml-3">必須</span> 9 <%= f.text_field :title, autofocus: true, autocomplete: 'title', placeholder: "タイトルを入力", class: "form-control" %> 10 </div> 11 12 <div class="form-group"> 13 <%= f.label "本文" %><span class="badge badge-info ml-3">必須</span> 14 <%= f.text_area :text, placeholder: "本文を入力", class: "form-control", rows: "10" %> 15 </div> 16 17 <div class="form-group"> 18 <%= f.submit "投稿する", class: "btn btn-primary btn-block" %> 19 </div> 20<% end %>
new.html.erb
html
1<div class="container p-5"> 2 <div class="shadow p-4 mb-5 bg-white rounded"> 3 <h1 class="text-center text-monospace">記事投稿</h1> 4 <%= render partial: 'form' %> 5 </div> 6</div>
articles.controller.rb
ruby
1class ArticlesController < ApplicationController 2 before_action :authenticate_user!, except: [:index] 3 4 def index 5 end 6 7 def new 8 @artilce = Article.new 9 end 10 11 def create 12 article = Article.new(article_params) 13 if article.save 14 redirect_to root_path 15 else 16 render :new 17 end 18 end 19 20 private 21 22 def article_params 23 params.require(:article).permit(:image, :title, :text).merge(user_id: current_user.id) 24 end 25end 26
routes.rb
ruby
1Rails.application.routes.draw do 2 devise_for :users 3 root to: "articles#index" 4 resources :articles, only: [:index, :new, :create] 5end
確認してみたこと
create.html.erbは作成していないので、viewに渡す必要がないのにarticles.controller.rbのcreate
アクションに付けていた**@**が原因なのかと思い、削除しましたが解決しませんでした。
@削除前のcreate
アクション
ruby
1def create 2 @article = Article.new(article_params) 3 if @article.save 4 redirect_to root_path 5 else 6 render :new 7 end 8end
プライベートメソッドとストロングパラメーターを定義して、それをcreate
アクションに引数で渡しているので保存の許可はできています。
利用環境
- Ruby 3.0.1
- Rails 6.1.3
回答1件
あなたの回答
tips
プレビュー