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

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

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

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

Ruby

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

Q&A

解決済

1回答

261閲覧

データの呼び出しができない(ActionController::UrlGenerationError)

yuki_sato_524

総合スコア15

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/12/07 04:03

前提・実現したいこと

現在、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メソッドは根本的に違う機能を持ってたりするのでしょうか?その辺もお聞かせいただけたらと思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

再現してみました。

irb

1@user = current_user 2@diary = @user.diaries.build 3 4@diary_last = @user.diaries.last 5=> #<Diary id: nil, user_id: 1> 6 7@user.diaries 8=> #<ActiveRecord::Associations::CollectionProxy [#<Diary id: 1, user_id: 1>, #<Diary id: nil, user_id: 1>]>

buildしたレコードがテーブルの最後のレコードになっており、
@user.diaries.lastでそのレコードを取得しています。
なのでidnilとなっているためNo route matchesと言われるのでしょう。
おそらくですが、取得したいのはその一つ前のレコードでしょうか。
とりあえずの解決としてはbuildする前に@diary_lastを取得する事ですかね。

投稿2018/12/07 04:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki_sato_524

2018/12/07 07:28

順序を入れ替えることで見事解決しました!! .buildとすることで.saveを行う前でも "データの入ってないひとつのレコード" として扱われるんですね!! これはとてもいい勉強になります! ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問