前提・実現したいこと
現在、Ruby on rails を勉強中で練習用としてオリジナルでアプリを開発中。
ユーザーがデータを保存するところまではうまくいったんですが、それを呼び出して画面に表示するというところで今不具合が生じているところです。
###試したこと
アクション内で.lastメソッドを用いて最新のデータのみ取り出したいのですがエラーが出てしまいうまくいきません。
ただ、同じコードのままlastメソッドをfirstメソッドに置き換えるだけでそのエラーは解消されます(目的と違うので解決には至ってない)。
また、保存データを一つだけ残して他を全て削除(.lastでも.firstでも同じデータを引き出せるように)してもやはりfirstメソッドではエラーはなく、lastメソッドの場合は同じエラーが出るので保存データそのものに問題がないように思えます。
また、別のモデルのデータは同様にlastメソッドを使っても呼び出せています。
発生している問題・エラーメッセージ
エラーメッセージ ActionController::UrlGenerationError in Toppages#index Showing /home/ec2-user/environment/trainary/app/views/toppages/index.html.erb where line #32 raised: No route matches {:action=>"edit", :controller=>"diaries", :id=>nil}, missing required keys: [:id] Extracted source (around line #32): 30 <% if @diary_last %> 31 <div style="margin-bottom:8px; margin-left:8px;"> 32 <button type="button" class="btn btn-success"><%= link_to "編集", edit_diary_path(@diary_last),:class => "href-btn" %></button> 33 <button type="button" class="btn btn-danger"><%= link_to "削除", diary_path(@diary_last), method: :delete, :class => "href-btn", data: {confirm: "削除してもよろしいですか??"} %></button> 34 </div> 35 <% else %> Rails.root: /home/ec2-user/environment/trainary
該当のソースコード
toppages_controller.rb class ToppagesController < ApplicationController def index if logged_in? @user = current_user @diary = @user.diaries.build @diary_last = @user.diaries.last #エラーが出るところ #@diary_last = @user.diaries.firstだとエラーなし @goal = @user.goals.last #Goalモデルのデータの場合は.lastでもエラーは出ない else @user = User.new end end end
toppages/index.html.erb <% if logged_in? %> <h1 class="head-line">Home</h1> <div class="row"> <div class="col-sm-3"> <div class="panel panel-info"> <div class="panel-heading"> <h2 class="text-center">前回の記録</h2> </div> <div class="panel-body"> <div> <h4>日付</h4> <p><%= @diary_last.month %>月<%= @diary_last.date %>日</p> </div> <div> <h4>記録内容</h4> <p><%= simple_format(@diary_last.content) %></p> </div> <div> <h4>体重</h4> <p><%= @diary_last.weight %>kg</p> </div> <div> <h4>プロテイン量</h4> <p><%= @diary_last.protein %>g</p> </div> </div> <div style="margin-bottom:8px; margin-left:8px;"> <button type="button" class="btn btn-success"><%= link_to "編集", edit_diary_path(@diary_last),:class => "href-btn" %></button> <button type="button" class="btn btn-danger"><%= link_to "削除", diary_path(@diary_last), method: :delete, :class => "href-btn", data: {confirm: "削除してもよろしいですか??"} %></button> </div> </div> </div>
routes.rb Rails.application.routes.draw do root to: "toppages#index" get "login"=>"sessions#new" post "login"=>"sessions#create" delete "logout"=>"sessions#destroy" get "signup" => "users#new" resources :users, :only => [:show, :create, :destroy, :edit, :update] get "analysis" => "diaries#analysis" resources :diaries, :only => [:new, :create, :destroy, :edit, :update, :index] resources :goals, :only =>[:new, :create, :edit, :update] end
rails routesの結果 analysis GET /analysis(.:format) diaries#analysis diaries GET /diaries(.:format) diaries#index POST /diaries(.:format) diaries#create new_diary GET /diaries/new(.:format) diaries#new edit_diary GET /diaries/:id/edit(.:format) diaries#edit diary PATCH /diaries/:id(.:format) diaries#update PUT /diaries/:id(.:format) diaries#update DELETE /diaries/:id(.:format) diaries#destroy
######自分の力のみでは解決できないようなのでどなたかよろしければアドバイスをいただけたらと思います。
######それと、lastメソッドとfirstメソッドは根本的に違う機能を持ってたりするのでしょうか?その辺もお聞かせいただけたらと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/07 07:28