前提・実現したいこと
Rubyでオークションサイトを作成しています。
投稿商品詳細ページに安い順で価格を並べて表示させるところまでできて、価格にリンクを付け
価格をクリックするとその価格を提示した人の詳細ページに遷移するという実装を行っています。
しかしながら価格をクリックすると下記のエラーが表示されました。
発生している問題・エラーメッセージ
コピペ用
error
1ActiveRecord::RecordNotFound in UsersController#show 2Couldn't find Sell with 'id'=1
画像ではこちらです
このエラーは「sellテーブルの中にid=1が入っていないです」という意味だと認識しています。
価格にも削除機能を付けて削除認めidが1の価格がなくなったためです。
下記のSeqel proをご確認ください
価格ごとにidがついているので、価格をクリックするとidが付与されたページに飛ぶものではないのかと思っていましたが、
それができていないみたいです。価格ごとに飛べるようにしたいのが今回の目的です。
作成したコード一覧
ルーティング
route.rb
コントローラー
users_contorller.rb
sells_controller.rb
charter_controller.rb
ビュー
charters/show.html
users/show.html
該当のソースコード
route.rb
ruby
1Rails.application.routes.draw do 2 get 'users/show' 3 devise_for :users 4 root to: "charters#index" 5 resources :charters do 6 resources :sells, only: [:create, :destroy, :show] 7 resources :users, only: [:show] 8 end 9end
ルーティングはcharterに紐つくためuserとsellをネストしています
rails routesをした場合下記の通りです。
charters/show.html.erb
html
1<h6>価格一覧</h6> 2<ul class="price-row"> 3 <% @sells.each do |sell|%> 4 <li class="price-lists"> 5 <%= link_to "#{sell.sell}円", charter_user_path(@charter), id: "price", class: "price-list" %> 6 </li> 7 <% end %> 8</ul>
users/show.html.erb
html
1<div class=some> 2<%= @name %> 3<%= @price%> 4 <div class="charter-delete"> 5 <%= link_to "削除", charter_sell_path(@sell), method: :delete %> 6 </div> 7</div>
users_controller.rb
class UsersController < ApplicationController def show @user = User.find(params[:id]) @charter = Charter.find(params[:id]) @name = @charter.user.username @sell = Sell.find(params[:id]) @price = @sell.sell end end
sells_controller.rb
class SellsController < ApplicationController def index @sells = Sell.all.order("sell asc") end def create @sell = Sell.create(sell_params) if @sell.save redirect_to charter_path(@sell.charter) else @charter = @sell.charter @sell = @charter.sell render "charters/show" end end def show @charter = Charter.find(params[:id]) @name = @charter.user.username @sell = Sell.find(params[:id]) @price = @sell.sell end def destroy @sell = Sell.find(params[:id]) if @sell.destroy redirect_to root_path end end private def sell_params params.require(:sell).permit(:sell).merge(user_id: current_user.id, charter_id: params[:charter_id]) end end
自分が考えている問題点(仮説)
charter/show.htmlのlinkをクリックした際に表示されるURLが
/charters/1/users/1
となっているので、ここが
/charters/1/users/2
などとなればいいと思っていますが、おそらくネストになっているため、charter_id = 1がこのURLに反映されているのだと思います。
Rails.application.routes.draw do get 'users/show' devise_for :users root to: "charters#index" resources :charters do resources :sells, only: [:create, :destroy, :show] do resources :users, only: [:show] end end end
ルーティングのネストを変えてみました。
rails routesをした場合下記の通りです
上から2行目のパスをcharter.show.htmlのリンクに記述しました。
charter/show.html.erbのリンク部分のパスを変えたものの今度は下記のようなエラーへ変わりました。
![]
:idを:user_idへ変更
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 13:16