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

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

ただいまの
回答率

88.57%

(Rails)新規投稿が反映されない。& link_to URLエラーの解消

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,316

HSRRRJSJQP

score 20

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
プログラミング初心者で現在アウトプットを兼ねてRailsでメモアプリを作成中。
しかし、下記2点の問題が発生し2日間試行錯誤いたしましたが解決できず。
質問させて頂きます。
①新規投稿が反映されない。
・1件のみは投稿できたが2件目以降がデータベースに反映されない。
・エラー文は発生しない。
②アイコンをクリックすると編集や削除ができるようにLink_toでパスを指定し、
繋がるようにするもエラーが発生。

エラーメッセージ
ActionController::UrlGenerationError in Posts#index
showing /〜〜〜/app/views/posts/index.html.haml where line #55 raised:
No route matches {:action=>"edit", :controller=>"posts", :id=>nil} missing required keys: [:id]

### 該当のソースコード
 =post.url
          %td 
            = link_to '編集', edit_post_path(@post) , method: :get, class: 'edit-btn'  do
              = icon('fas', 'user-edit',class:'icon')
            -# = link_to '編集', edit_post_path(@post), class: 'edit-btn' 
          %td 

ここに言語名を入力
Ruby,Rails
```

試したこと

①新規投稿が反映されない。
(1)products_controller内のストロングパラメータの記述内容を確認。
mergeでidが取得できるように追記。
(2)モデル内のアソシエーションやバリテーションの記載内容に誤りがないか確認。
記載内容には誤りはないことを確認。
(3)createアクションの記載に@post.saveを追記してみるが改善せず。
(4)createアクションにbinding.pryすると情報は取得できている。
②アイコンにクリックし指定したページに飛ばす。
(1)エラー文から「postsコントローラーのeditアクションにidがないからマッチするルートがない。だからURLが生成できない。」ということを理解する。
(2)rails routesでpathの記載内容に誤りがないことを確認
(3)methodを指定し行き先を絞る内容でコードを記載するもエラー。
(4)viewは作成済みで、コントロール内で「@post = Post.find(params[:id])」と
インスタンス変数でidを取得しているのに何故Nilと言われているのかが理解できず。

補足情報(FW/ツールのバージョンなど)

Rails 5.0.7.2

ここにより詳細な情報を記載してください。
【routes.rb】
Rails.application.routes.draw do
devise_for :users
root 'posts#index'
resources :posts
end

【models/user.rb】
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :posts
end

【models/post】
class Post < ApplicationRecord
validates :id, :number, :title, :word, :content, :url, presence: true
belongs_to :user
end

【posts_contoroller】
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destory]

def index
@posts = Post.all
@post = Post.new
end

def new
@post = Post.new
end

def create
@post = Post.create(post_params)
@post.save
redirect_to :root
end

def destory
@post.destory
end

def edit
end

def update
@post.update(post_params)
redirect_to :root
end

def show
end

def set_post
@post = Post.find(params[:id])
end

private
def post_params
params.require(:post).permit(:id, :number, :title, :word, :content, :url).merge(id: current_user.id)
end
end

【views/post/index.html.haml】
・・・・
%td 
=post.url
%td 
= link_to '編集', edit_post_path(@post) , method: :get, class: 'edit-btn'  do
= icon('fas', 'user-edit',class:'icon')

%td 
= link_to '削除', url ="#", method: :delete, class: 'delete-btn', data: { confirm: '本当に消しますか' } do 
= icon('fas', 'trash-alt',class:'icon')

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

①新規投稿が反映されない。

正直よくわかりませんが、create!メソッドを用いる事で検証失敗時にエラーとなるので
わかりやすくなるかもしれません。

def create
  @post = Post.create!(post_params)
  redirect_to :root
end

②アイコンをクリックすると編集や削除ができるようにLink_toでパスを指定し、
繋がるようにするもエラーが発生。

edit_post_path(post)の間違いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/03 08:15

    asm様
    回答ありがとうございます。
    ①について
    ご指摘受けた箇所に追記したところ下記エラーが出たので
    コントローラーに原因があることに絞ることができました。
    「エラー文」
    ActiveRecord::RecordInvalid in PostsController#create
    バリデーションに失敗しました: Userを入力してください
    @post = Post.create!(post_params)

    ②について
    ご指摘を受ける前に「link_to edit_post_path(post)」と試し改善しました。
    追記していなかったため余分にお時間取らせてしまい失礼いたしました。
    1点疑問なのですが、controllerで@postにidを代入しているのに
    @postではエラー、postにしたらエラーにならない理由が理解ができておりません。
    追加で恐縮ですが併せてご教授頂けないでしょうか。
    ※@postにすると変わらずにActionController::UrlGenerationError in Posts#indexが表示されます。

    キャンセル

  • 2020/03/03 10:27

    > ①
    なるほど
    post_paramsのmergeしている部分が
    誤: merge(id: current_user.id)
    正: merge(user_id: current_user.id)
    だったのですね。

    > ②
    @post = Post.new
    では、@postにはデータベースに保存されていない新規データが代入されます。
    データベースに保存されていないのでidもなかったように記憶しています。

    キャンセル

  • 2020/03/03 13:02

    asm様
    回答ありがとうございます。
    ①で指摘を受けたmerge(user_id: current_user.id)について
    migrationファイルを確認したところ
    user_idが登録されていないことに気付きました💦
    そもそも登録していなかったのでデータが反映されていないという次第でした。
    抜け漏れでおつきあいさせてしまい失礼いたしましたm(_ _)m

    ご指摘受けた内容を糧に勉強とアウトプットに励みます!

    キャンセル

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

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

関連した質問

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