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

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

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

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

Ruby

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

Q&A

解決済

1回答

2410閲覧

User.find(params[:id]) でエラーになってしまいます。

muraishi

総合スコア17

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/02/08 16:46

編集2020/02/09 01:17

やりたいこと

ユーザー名をUser.find(params[:id])取得し、form_forでユーザー名をDBに保存したいです。

なぜできない?

下記のエラーが出てしまいます。

ruby

1 2ActiveRecord::RecordNotFound in StaticPagesController#home 3Couldn't find User with 'id'= 4Extracted source (around line #8): 5 66 77 88 99 1010 1111 12 13 14 15 16 end 17 @timetable = Timetable.new 18 @user = User.find(params[:id]) 19 @username = @user.name 20 end 21 22 23Rails.root: /home/ec2-user/environment/portfolio 24Application Trace | Framework Trace | Full Trace 25 26app/controllers/static_pages_controller.rb:8:in `home' 27 28Request 29 30Parameters: 31 32None 33 34Toggle session dump 35Toggle env dump 36Response 37 38Headers: 39 40None 41 42

記述したコード

ruby

1※バリューの中にユーザー名を表示して、ユーザーに自分の名前をいちいち打たなくてもそのままデフォルトで送信すればユーザーの名前がDBに保存されるようにしたいです。 2<%= form_for(@timetable) do |f| %> 3 <%= f.text_field :reservation1, value: @username %> 4 5 <%= f.submit %> 6<% end %>

ruby

1lass StaticPagesController < ApplicationController 2 def home 3 if logged_in_as_staff? 4 @micropost = current_staff.microposts.build 5 @feed_items = current_staff.feed.paginate(page: params[:page]) 6 end 7 @timetable = Timetable.new 8 @user = User.find(params[:id]) 9 @username = @user.name 10 end 11 12 def contact 13 end 14 15 def campaign 16 end 17 18 def new 19 20 end 21end 22

ruby

1Rails.application.routes.draw do 2 3 4 5 root 'static_pages#home' # => root_path 6 get '/contact', to: 'static_pages#contact' 7 get '/campaign', to: 'static_pages#campaign' 8 get '/signup', to: 'users#new' 9 get '/timetable', to: 'users#timetable' 10 post '/signup', to: 'users#create' 11 12 get '/login', to: 'sessions#new' 13 post '/login', to: 'sessions#create' 14 delete '/logout', to: 'sessions#destroy' 15 16 get '/staffsignup', to: 'staffs#new' 17 post '/staffsignup', to: 'staffs#create' 18 19 get '/stafflogin', to: 'sessions_for_staff#new' 20 post '/stafflogin', to: 'sessions_for_staff#create' 21 delete '/stafflogout', to: 'sessions_for_staff#destroy' 22 23 get '/stafftimetable', to: 'timetables#timetable_index' 24 25 resources :users 26 resources :staffs 27 resources :account_activations, only: [:edit] 28 resources :microposts, only: [:create, :destroy] 29 resources :timetables 30 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 31end 32

ちなみに。。。コントローラーを下記のように変更したら、無事にユーザーの名前だけ表示されました。
汚いコードだとはわかっていますが、この場合、どうすればきれいに書けるのかも教えていただきたいです!

ruby

1class StaticPagesController < ApplicationController 2 def home 3 if logged_in_as_staff? 4 @micropost = current_staff.microposts.build 5 @feed_items = current_staff.feed.paginate(page: params[:page]) 6 end 7 @timetable = Timetable.new 8 @user = User.find(1)  ←これならちゃんと取得し、名前がvalueに表示されます! 9 @username = @user.name 10 end 11 12 def contact 13 end 14 15 def campaign 16 end 17 18 def new 19 20 end 21end 22

この下から追記です!

ruby

1class TimetablesController < ApplicationController 2 def timetable_index 3 @timetables = Timetable.all 4 end 5 6 def new 7 @timetable = Timetable.new 8 end 9 10 def create 11 end 12 13 def destroy 14 end 15 16end 17

ruby

1<% if logged_in_as_staff? %> 2 <div class="row"> 3 <aside class="col-md-4"> 4 <section class="staff_info"> 5 <%= render 'helpers/staff_info' %> 6 </section> 7 <section class="micropost_form"> 8 <%= render 'helpers/micropost_form' %> 9 </section> 10 </aside> 11 <div class="col-md-8"> 12 <h3>Micropost Feed</h3> 13 <%= render 'helpers/feed' %> 14 </div> 15 </div> 16<% else %><div class="center jumbotron"> 17 <h1>Thank you for comming!!</h1> 18 <h2> 19  ユーザー登録をしていただくと、施術内容が予約表に反映され、より正確な予約状況がわかります! 20 </h2> 21 22 <div class="btn"> 23 <%= link_to "登録する", signup_path, class: "btn btn-lg btn-primary" %> 24 </div> 25</div> 26 27<%= render 'helpers/time_table' %>  ←このレンダーでエラーメッセージの下に記載したform_forのページを呼んでいます 28 29<% end %>

初心者なので、なにか必要な情報など漏れているかもしれません。
よろしくお願いいたします。

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

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

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

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

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

siruku6

2020/02/08 20:25 編集

controller上で、params[:id]が取得できずに中身がnilになっているようです。 deviseを使っていれば、current_userという便利メソッドで対策できるのですが、そうではないようなので、他の方法が必要そうです。 f.submitをクリックすると、timetablesコントローラー?に処理が移行すると思うのですが、場合によってはそこの処理も書き換えないといけないかもしれません。 というわけで、timetablesコントローラーも掲載していただけないでしょうか? (おそらく redirect_to で root_path に遷移させているのだとは思いますが...)
winterboum

2020/02/08 21:30

siruku6さんの指摘に加え、 action home にparams[:id]が渡っていないので、action home を呼んでいるview、そのviewを書き出しているactionも載せてください
muraishi

2020/02/09 01:22

ありがとうございます。やはりparams[:id]が取得できていないのですね!devise?よくわからないので今からググります!教えてくださりありがとうございます〜 この場合、timetableコントローラーも絡んでくるのですね! winerboumさん、そのviewを書き出しているアクションというのがよくわかりませんでした。どこかのコントローラーのことですか??すみません...
siruku6

2020/02/09 01:35

うおお予想外なことにtimetablesコントローラーのcreateアクションが空じゃないですか..! たぶんですが、submitボタンを押したときにエラーになるのではなくて、そもそもhome画面自体が表示できていない、ということですかね。。 確認ですが、deviseを使用しない方向で開発を進めるとしたらログイン認証はどうやって行いますか?? (deviseを使うのであれば、最初は覚えることがたくさんあって大変ですが、一気に解決には近づくと思います。)
winterboum

2020/02/09 02:31

>そのviewを書き出しているアクション はい、controllerのmethodです
muraishi

2020/02/09 03:15

返事がおれくれて申し訳ないです! siruku6さん、 そうなんです。サブミットボタンを押す以前に画面が表示されません! お二方へ。 私のプログラミングに対する理解が浅いので、アプリケーション全体をみた方が早いと思ったので、githubにpushしました!多分みれると思います! https://github.com/frisk-peppermint/portfolio いろいろ汚いと思いますがよろしくお願いいたします! あと、お気づきかもしれませんが、このアプリケーションはrails tutorialを拡張した物です!
guest

回答1

0

ベストアンサー

params[:id]というのは、ブラウザが送信してきたパラメータの中のidと名前付けられた文字列を返します。
(routes.rbでリクエストURLからパラメータに追加できるけど、まぁブラウザが送信してることには違いない)
idパラメータをブラウザが送信していない場合はnilが返ります。

例えば、GETに対しては?id=1で1を送信する事ができるので
ブラウザのURL欄の末尾に?id=1を付け加えてエンターを押せば
@user = find(1)@user = find(params[:id])は同じ動作になりますし
Railsの_pathヘルパー等にid: 1もしくは{id: 1}を引数として渡してやれば?id=1を末尾に付ける、みたいな事をやってくれます。

ここで問題になるのが、root_pathは普通、直接アクセスしてくるものなので任意のパラメータを付け加えるのが難しいということです。

また、やりたいことを勝手に推測するとあなたがやりたいのは現在ログインしているユーザーの取得なのではないかと思います。
その場合は、いちいち現在ログインしているユーザーのidを伝搬していくのは面倒です。


このようにparamsの使用に難がある場合はsessionを用います。
詳しい説明は省きますのでRailsTutorialを読み直して欲しいのですが

app/helper/sessions_helper.rbを見る限り

@user = current_userにて現在ログインしているユーザーが取れます。

ruby

1@timetable = Timetable.new 2@timetable.reservation1 = current_user.name if logged_in?

erb

1<%= form_for(@timetable) do |f| %> 2 <%= f.text_field :reservation1 %> 3 4 <%= f.submit %> 5<% end %>

で良かったはず

投稿2020/02/09 09:11

asm

総合スコア15147

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

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

muraishi

2020/02/09 09:42

詳しく説明してくださり本当にありがとうございます!root_pathの性質みたいなもの?は初めて知りました。はい、ユーザーのIDを取得してきて、それに紐づく名前(user.name)をform_forのvalueに渡すことで、ユーザーが予約を取るときに、いちいち自分の名前をフォームに打たなくてもいいようにしたいのです〜 早速コードをStaticpaegsControllerのhomeアクションに書いてみたのですが、エラーが出てしまいました。 ArgumentError in Users#timetable Showing /home/ec2-user/environment/portfolio/app/views/helpers/_time_table.html.erb where line #120 raised: First argument in form cannot contain nil or be empty Extracted source (around line #120): 118 119 120 121 122 123 </div> <%= form_for(@timetable) do |f| %> ← ここが赤くなっています! <%= f.text_field :reservation1 %> <%= f.submit %> Trace of template inclusion: app/views/users/timetable.html.erb Rails.root: /home/ec2-user/environment/portfolio Application Trace | Framework Trace | Full Trace app/views/helpers/_time_table.html.erb:120:in `_app_views_helpers__time_table_html_erb___2205844234424230163_70100690180620' app/views/users/timetable.html.erb:1:in `_app_views_users_timetable_html_erb__3992942583381156466_70100690101320' Request Parameters: None 私自身の根本的な力不足をすごく感じています。もう一度、復讐して、Rails に対する理解力の底上げしようと思います!!!
asm

2020/02/09 10:13

> ArgumentError in Users#timetable rootから/users/timetableに飛んだ後でしょうか? その場合、本質問と関係ない気がしますが… 前回同様、UsersController#timetableに`@timetable = Timetable.new`をつければいいですが まぁ、面倒なのでview側で対処した方が楽ですね。 <%= form_for(@timetable || Timetable.new) do |f| %>
muraishi

2020/02/09 11:22

おお、ちゃんと動きました!ありがとうございます! 質問の意図が不明瞭になってしまって申し訳ないです。 もう一度一から復習しようとおもういます。長く付き合っていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問