質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

408閲覧

`posts_path'のundefinedエラーが解決できない

KENT1004

総合スコア77

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/03/16 12:23

編集2022/03/17 06:09

新規投稿画面でpost_pathの未定義エラーが発生します。
新規投稿の空投稿に対するエラーメッセージを表示するために実装しているときに起きている事象です。

undefined method `posts_path' for #<#<Class:0x00007f880a71ddd0>:0x00007f880a727e70>

new.html.erb

1  <div class="main posts-new"> 2 <div class="container"> 3 <h1 class="form-heading"style="text-align: center">投稿する</h1> 4 <%= form_with(model: @post, local: true) do |form| %> 5 <div class="form"> 6 <div class="form-body"> 7ここから 8 <% @post.errors.full_messages.each do |message| %> 9 <div class="form-error"> 10 <%= message %> 11 </div> 12 <% end %> 13ここまで 14 <div> 15 <%= form.label :comment, "ひとこと" %> 16 <%= form.text_field :comment %> 17 </div> 18 19 <div> 20 <%= form.label :url, "URL" %> 21 <%= form.text_field :url %> 22 </div> 23 <div> 24 <%= form.label :content, "概要" %> 25 <%= form.text_area :content %> 26 </div> 27 28 29 <div> 30 <%= form.submit "投稿する", data: { confirm: '上記の内容で投稿を作成します。よろしいですか?' } %> 31 </div> 32 </div> 33</div> 34 <% end %> 35 </div> 36</div>

post_controller.rb

1class PostsController < ApplicationController 2 before_action :authenticate_user 3 before_action :ensure_correct_user, {only: [:destroy]} 4 def index 5 @posts = Post.all.order(created_at: :desc) 6 end 7 8 9 def show 10 @post = Post.find_by(id: params[:id]) 11 @user = @post.user 12 @likes_count = Like.where(post_id: @post.id).count 13 end 14 15 def new 16 @user = User.new 17ここから 18 @post = Post.new 19ここまで 20end 21 22 def create 23 @post = Post.new(posts_params) 24 25 if @post.save 26 flash[:notice] = "投稿完了" 27 redirect_to("/posts/index") 28 else 29 render("/posts/new") 30 end 31 32 end 33 34 def posts_params 35 #投稿内容をパラメータで受け取る 36 params.permit(:comment, :site, :url, :content, :tag).merge(user_id: @current_user.id) 37 end 38 39 40 def edit 41 @post = Post.find_by(id: params[:id]) 42 end 43 44 def destroy 45 @post = Post.find_by(id: params[:id]) 46 @post.destroy 47 flash[:notice] = "投稿を削除しました" 48 redirect_to("/posts/index") 49 end 50 51 def ensure_correct_user 52 @post = Post.find_by(id: params[:id]) 53 if @post.user_id != @current_user.id 54 flash[:notice] = "権限がありません" 55 redirect_to("/posts/index") 56 end 57 end 58end

ここからここまでの2箇所を削除するとエラーなく新規投稿画面に遷移できるのですが
エラーの真因がわかりません。
また今までcontrollerに@postがなかったのに処理が通っていたのもよくわかりません。(create処理の@postを参照していたから?)

この真因と解決策についてご教授宜しくお願い致します。

user.rb

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable, :confirmable 6 validates :name, {presence: true, uniqueness: true} 7 validates :email, {presence: true, uniqueness: true} 8 validates :password,{presence: true} 9 10 def posts 11 return Post.where(user_id: self.id) 12 end 13 14 def update_without_current_password(params, *options) 15 params.delete(:current_password) 16 17 if params[:password].blank? && params[:password_confirmation].blank? 18 params.delete(:password) 19 params.delete(:password_confirmation) 20 end 21 22 result = update_attributes(params, *options) 23 clean_up_passwords 24 result 25 end 26 end 27

routes.rb

1Rails.application.routes.draw do 2 devise_for :users, controllers: { 3 registrations: "users/registrations" 4 5 } 6 post "users/:id/update" => "users#update" 7 post "likes/:post_id/create" => "likes#create" 8 post "likes/:post_id/destroy" => "likes#destroy" 9 get "users/:id/edit" => "users#edit" 10 # post "users/create" => "users#create" 11 get "users/:id" => "users#show" 12 post "login" => "users#login" 13 get "login" => "users#login_form" 14 post "logout" => "users#logout" 15 16 17 get "users/:id/likes" => "users#likes" 18 19 # get "signup" => "users#new" 20 21 get "posts/index" => "posts#index" 22 get "posts/new" => "posts#new" 23 get "posts/:id" => "posts#show" 24 post "posts/new" => "posts#create" 25 post "posts/create" => "posts#create" 26 post "posts/:id/destroy" => "posts#destroy" 27 get "/" => "home#top" 28 get "about" => "home#about" 29end 30

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

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

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

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

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

winterboum

2022/03/17 02:05

以下略 の方が必要ですね。 controller も省略しすぎ。せめて create とそれが呼ぶmethodは載せて。 及び routes.rb も必要になる可能性あるので、ついでに載せましょう
winterboum

2022/03/17 04:07

それ良くないよ 質問は修正できるのですから。 同じ質問をダブって載せるのは禁止されてます。
KENT1004

2022/03/17 06:11

失礼しました。新規の投稿は削除リクエストしました。
guest

回答1

0

ベストアンサー

form_with(model: @post, local: true) が想定している path が routes.rb に用意されていないのが原因です。

routes で個別に記述するのはやめて resources :posts にしましょう。

投稿2022/03/17 08:08

winterboum

総合スコア23349

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

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

KENT1004

2022/03/17 13:20

resources :postsでまとめましたが別のエラーが発生しています get "posts/new" => "posts#new"の部分でルーティングは補完できていると思ったのですが、具体的にどの部分のパスが足りないかわかりますでしょうか?
winterboum

2022/03/17 13:48

そういうとき その別のエラーメッセージをなぜ載せないのかな。 new ではなく create がないのです。 が、 それから生成される なんとか_path が form_with model: @post が想定するものと一致しないと厄介です。 なので resources を使うことを薦めます。それが Rails標準ですし
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問