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

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

ただいまの
回答率

88.21%

NoMethodErrorについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 223

wantonsong

score 2

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

宜しくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

@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/14 13:16

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

    キャンセル

  • 2020/08/14 15:58

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

    キャンセル

  • 2020/08/14 16:03

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

    キャンセル

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

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る