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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

HTML

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

Q&A

解決済

2回答

1081閲覧

特定の投稿詳細ページに遷移できない原因を解決したい

yuu0000

総合スコア4

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2021/05/13 10:18

投稿詳細ページに遷移したい

現在投稿詳細ページに遷移し、実装を進めようとしておりましたがCouldn't find Tag with 'id'=3 とエラーが起きてしまいます。

1つ目の投稿では詳細ページに遷移できましたが、id=3の投稿ページには遷移できない現象が起きております。

確認してみたところ、パラメーターの取得はできていると表示されておりました。
https://gyazo.com/9d3f1c443c51613223c28f6e8f35a238

私の認識だと、投稿テーブルと紐付いているタグテーブルの間に何らかの問題があると考えております。

発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound in UploadsController#show Couldn't find Tag with 'id'=3 def show @upload = Upload.find(params[:id]) @tag = Tag.find(params[:id])⇦この部分 end private Request Parameters: {"_method"=>"get", "authenticity_token"=>"[FILTERED]", "id"=>"3"}

該当のソースコード

app/views/uploads/index.html.erb

html

1 <div id="content-table"> 2 <% @uploads.each do |upload| %> 3 <div class="content-page"> 4 <%= link_to upload_path(upload.id), class: "upload-link", method: :get do %> 5 <div class="upload-contents-wrapper"> 6 <div class="upload-img-contents"> 7 <%= image_tag upload.image, class: "upload-img" if upload.image.attached? %> 8 </div> 9 <div class="upload-contents-detail"> 10 <div class="upload-name"><%= upload.title %></div> 11 <% upload.tags.each do |tag| %> 12 <div class="upload-tags">#<%= tag.name %></div> 13 <% end %> 14 </div> 15 <div class="upload-contents-explain"> 16 <div class="upload-explain"><%= upload.text %></div> 17 </div> 18 <p class="upload-user"> 19 <a class="user-name__image" href="#"> 20 <img src="assets/image-4.jpg" width="40" height="40" alt=""> 21 </a> 22 <%= link_to upload.user.name, "#", class: "upload-user__name" %> 23 </p> 24 </div> 25 <% end %> 26 </div> 27 <% end %> 28 </div>

app/controllers/upload_controller.rb

controller

1class UploadsController < ApplicationController 2 def index 3 @uploads = Upload.all.order(created_at: :desc) 4 end 5 6 def new 7 @upload_form = UploadForm.new 8 end 9 10 def create 11 @upload_form = UploadForm.new(upload_params) 12 if @upload_form.valid? 13 @upload_form.save 14 redirect_to root_path 15 else 16 render new 17 end 18 end 19 20 def show 21 @upload = Upload.find(params[:id]) 22 @tag = Tag.find(params[:id]) 23 end 24 25 private 26 27 def upload_params 28 params.require(:upload_form).permit(:title, :text, :url, :working_day, :day_off, :cafe_wifi_id, :cafe_charging_id, :cafe_smoking_id, :image, :name).merge(user_id: current_user.id) 29 end 30end

app/config/routes

routes

1Rails.application.routes.draw do 2 devise_for :users 3 get 'uploads/index' 4 root to: "uploads#index" 5 resources :uploads, only: [:index, :new, :create, :show] 6end

app/models/upload_form

model

1class UploadForm 2 include ActiveModel::Model 3 attr_accessor :title, :text, :url, :working_day, :day_off, :cafe_wifi_id, :cafe_charging_id, :cafe_smoking_id, 4 :user_id, :image, :name 5 6 with_options presence: true do 7 validates :title 8 validates :text 9 validates :cafe_wifi_id 10 validates :cafe_charging_id 11 validates :cafe_smoking_id 12 validates :user_id 13 validates :image 14 validates :name 15 end 16 17 with_options numericality: { other_than: 0 } do 18 validates :cafe_wifi_id 19 validates :cafe_charging_id 20 validates :cafe_smoking_id 21 end 22 23 def save 24 upload = Upload.create(title: title, text: text, url: url, working_day: working_day, day_off: day_off, cafe_wifi_id: cafe_wifi_id, cafe_charging_id: cafe_charging_id, cafe_smoking_id: cafe_smoking_id, user_id: user_id, image: image) 25 tag = Tag.create(name: name) 26 # map = Map.create(address: address, latitude: latitude, longitude: longitude, upload_id: upload_id) 27 28 UploadTagRelation.create(upload_id: upload.id, tag_id: tag.id) 29 end 30end

試したこと

・今回のエラーの場合、コントローラー内のshowアクションの記述、index.html.erbのパスの指定や記述の内容に問題があると考えました。
<% @uploads.tags.each do |tag| %>ような記述にしてみましたが変化はありませんでした。
・他の投稿では詳細ページに遷移することができているため、index.html.erbのeachメソッドの記述方法などに誤りはないかなと思い、コントローラー内のshowアクションの@tag=Tag.find(params[:id])にエラーの原因があると考えましたが、どこを修正すればいいのか調べてもわかりませんでした。

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

開発環境
・rubymine
・ruby(3.0.1)
・Ruby on rails (6.1.3.1)

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

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

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

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

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

guest

回答2

0

@tag=Tag.find(params[:id])にエラーの原因がある

そうですね。TagUploadを同じidで検索するのは明らかに何かおかしいです。

そして、この際見るべきはapp/views/uploads/show.html.erbにて
@tagがどう使われているか?です。

使われていない場合は、@tagは不要ということになります。

もし、form_with(model: @tag)で新規タグを追加するために使われていた場合は

ruby

1@tag = @upload.tags.build

列挙して表示

erb

1<% @tag.each do|tag| %>

だった場合は

ruby

1@tag = @upload.tags

となります。
さらに言えば、単数形の変数名に複数のタグを期待するのがわかりにくいので
変数名を@tagsに変えたいところです。

投稿2021/05/13 18:30

編集2021/05/13 23:07
asm

総合スコア15149

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

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

yuu0000

2021/05/14 07:12

ご連絡ありがとうございます! 上記のように記述してみたところidが見つからないというエラーが解消されました!
guest

0

自己解決

詳細ページに遷移させるコードを、

@upload = Upload.find(params[:id]) @tag = Tag.find(params[:id])

にしていたため、同じidで取得させようしたことから紐ずくタグのidを取得することができないエラーが起きていました。

正解は、

@upload = Upload.find(params[:id]) @tag = @upload.tags

上記の記述を行い、投稿テーブル(upload)とタグを紐付け、インスタンス変数@tagに代入する必要がありました。

投稿2021/05/15 14:39

yuu0000

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問