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

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

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

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

Q&A

解決済

1回答

1367閲覧

NoMethodErrorについて

wantonsong

総合スコア3

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/13 07:23

編集2020/08/13 14:02

railsでWEBサイト作成時に、下記エラーメッセージが表示され、正常に処理が出来ません。

エラーメッセージ

・NoMethodError in Posts#new
Showing /home/ec2-user/environment/photo2/app/views/posts/new.html.erb where line #7 raised:

undefined method `post01s_path' for #<#Class:0x00007f83d475be08:0x00007f83d475a260>
Did you mean? posts_path
Extracted source (around line #7):

5 <h1>新規Photo投稿</h1> 6 <!--<form method="post" action="#" enctype="multipart/form-data">--> 7<%= form_for @post do |f| %> 8 <!-- ファイル選択ボタン --> 9 <div class="file_wrap"> 10 <input type="file" name="upload_file" />

・モデル(post01.rd)

class Post01< ApplicationRecord belongs_to :user01 has_many :post_image01s, dependent: :destroy end

・ヘルパー

module PostsHelper end

・コントローラー

class PostsController < ApplicationController def new @post = Post01.new end #投稿処理 def create #ここに処理を実装 end end

・ルーティング

$ rails routes Prefix Verb URI Pattern Controller#Action root GET / users#top top GET /top(.:format) users#top profile_edit GET /profile/edit(.:format) users#edit profile GET /profile(/:id)(.:format) users#show follower_list GET /follower_list(/:id)(.:format) users#follower_list follow_list GET /follow_list(/:id)(.:format) users#follow_list sign_up GET /sign_up(.:format) users#sign_up sign_up_process POST /sign_up(.:format) users#sign_up_process sign_in GET /sign_in(.:format) users#sign_in sign_in_process POST /sign_in(.:format) users#sign_in_process sign_out GET /sign_out(.:format) users#sign_out new_posts GET /posts/new(.:format) posts#new edit_posts GET /posts/edit(.:format) posts#edit posts GET /posts(.:format) posts#show PATCH /posts(.:format) posts#update PUT /posts(.:format) posts#update DELETE /posts(.:format) posts#destroy POST /posts(.:format) posts#create

申し訳ございませんが、対応方法のご教示をお願い致します。

追記です。
外部キーの設定を誤ってしまった可能性があります・・・
もし訂正する必要がございましたら、方法をご教示いただけますでしょうか?

class CreatePost01s < ActiveRecord::Migration[5.1] def change create_table :post01s do |t| t.references :user, foreign_key: true t.text :caption t.timestamps end end end class CreatePostImage01s < ActiveRecord::Migration[5.1] def change create_table :post_image01s do |t| t.references :post, foreign_key: true t.string :name t.timestamps end end end

モデル

class Post01< ApplicationRecord belongs_to :user01 has_many :post_image01s, dependent: :destroy end class PostImage01 < ApplicationRecord belongs_to :post01 end class User01 < ApplicationRecord #リレーション(1:N) has_many :post01s #データの保存前に、パスワードを暗号化するメゾット(convert_passworc)を実行するよう設定 before_save :convert_password #パスワードを暗号化するメゾット def convert_password self.password = User01.generate_password(self.password) end #パスワードをmd5に変換するメゾット def self.generate_password(password) #パスワードに適当な文字列を付加して暗号化する salt = "h!hgamcRAdh38bajhvgai17ysvb" Digest::MD5.hexdigest(salt + password) end #バリテーション VALID_EMAIL_REGEX = /\A[\w\-.]+@[a-z\d\-.]+.[a-z]+\z/i validates :name, presence: true validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}, uniqueness: true validates :password, presence: true, length:{minimum: 6} end 宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@post の中身が Post のインスタンスではなくPost01 のインスタンスなのでposts_pathではなくpost01s_pathになっています。

解決策案

  1. model の名前を Postに変える(定義しているfileの名前も直す)
  2. routes.rb でコツコツroutesを書く

post "posts01" => "posts#create" みたいに
3. <%= form_for @post,url: posts_path で行けるかなぁ、、、

追記
今の構造のままでも宣言をいっぱいすれば動くようになるかもしれませんが、初心者のやることではないです。
Railsの規約にそってmodelもtableも作りなおしたほうが良いです。そのほうが早い。
今日中に、ならよけい。私がつきっきりなんてできませんから。

01をつける必要がわからないのですが、無くても良いのなら migration、モデル、モデルの中の色々な定義の中に有る 01 を全部削除する

01をつけなければならない事情があるのなら全てにつける。中途はんばはだめ
たとえば
routeがpost01になっていない
t.references :post がpost01になっていない
belongs_to :user01 なのに t.references :user

モデル名、コントr−ラー名、route定義、関連定義、reference定義 はみな揃えてください。
大文字で始まるか否か、単数形か複数形かの違いはありますが。
(これらは単数形か複数形かはセンシティヴな定義です)

databaseを空にしてよければ dropして create して migration書きなおして migrate
空にできない事情があるなら rename_tableやrename_columnなmigrationを作る
ただ、後者は外部key制約にかかって失敗するかも

投稿2020/08/13 07:38

編集2020/08/14 04:43
winterboum

総合スコア23567

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

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

wantonsong

2020/08/13 10:00

ご回答ありがとうございます。 3.の方法でページは正常に表示できましたが、今度は以下エラーが表示されました。 unknown attribute 'post01_id' for PostImage01. コントローラー class PostsController < ApplicationController #アクション処理に入る前に認証 before_action :authorize def new @post = Post01.new end #投稿処理 def create #ここに処理を実装 @post = Post01.new(post_params) upload_file = params[:post01][:upload_file] #投稿画像がない場合 if upload_file.blank? flash[:danger] = "投稿には画像が必要です" redirect_to new_post_path and return end upload_file_name = upload_file.original_filename output_dir = Rails.root.join('public', 'images') output_path = output_dir + upload_file_name File.open(output_path, 'w+b') do |f| f.write(upload_file.read) end @post.post_image01s.new(name: upload_file_name) #データベースに保存 if @post.save #成功 flash[:success] = "投稿しました。" redirect_to new_post_path and return else #失敗 flash[:danger] = "投稿に失敗しました。" end end private def post_params params.require(:post01).permit(:caption).merge(user_id: current_user.id) end end SQLのカラム名が異なるとの事ですが、以下SQlよりカラム名を変更するのが望ましいでしょうか? (可能であれば変更は控えたいです。) mysql> show columns from post_image01s; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | post_id | bigint(20) | YES | MUL | NULL | | | name | varchar(255) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-- 度々で申し訳ございませんが、ご教示頂けますと幸いです。
wantonsong

2020/08/13 10:25

追記です。 外部キーの設定を誤ってしまった可能性があります・・・ もし訂正する必要がございましたら、方法をご教示いただけますでしょうか? class CreatePost01s < ActiveRecord::Migration[5.1] def change create_table :post01s do |t| t.references :user, foreign_key: true t.text :caption t.timestamps end end end class CreatePostImage01s < ActiveRecord::Migration[5.1] def change create_table :post_image01s do |t| t.references :post, foreign_key: true t.string :name t.timestamps end end end
winterboum

2020/08/13 13:08

Post でなく Post01 なのが気になっています。Postなんとか というのがたくさん有るのですか?  model の一覧とそれらの関連定義を載せてください。 全貌が見えないと間違える。 コメントに載せないでね、見難いから
wantonsong

2020/08/13 14:02

失礼致しました。 質問欄に追記しました。 宜しくお願い致します。
wantonsong

2020/08/14 04:16

もうしわけございません。こちらでも色々対応方法を考えていますが、 解決に至っておりません。 今日中に作業を完了させたいため、不足している情報などがございましたら、提供致しますので 何卒ご教示の程をお願い致します。
wantonsong

2020/08/14 06:58

お忙しいところ、ご回答ありがとうございます。 別のサイトで同名のテーブルを作成している為、できれば削除したくなかったので、 別名でテーブルを作成してしまいました。 本来そういった作成は規約上望ましくない事が、分かっていればこの方法は取らなかったのですが・・・ 無知すぎて本当に申し訳ございません。 頂いた対応方法を元にこちらで対応致します。 ありがとうございました。
winterboum

2020/08/14 07:03

??? 別サイトすなわち別DBなのですから同じ名前でもぶつかりませんよ。 わたしなぞ Userを何箇所で作ったことか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問