やりたいこと
ユーザー名を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 %>
初心者なので、なにか必要な情報など漏れているかもしれません。
よろしくお願いいたします。
controller上で、params[:id]が取得できずに中身がnilになっているようです。
deviseを使っていれば、current_userという便利メソッドで対策できるのですが、そうではないようなので、他の方法が必要そうです。
f.submitをクリックすると、timetablesコントローラー?に処理が移行すると思うのですが、場合によってはそこの処理も書き換えないといけないかもしれません。
というわけで、timetablesコントローラーも掲載していただけないでしょうか?
(おそらく redirect_to で root_path に遷移させているのだとは思いますが...)
siruku6さんの指摘に加え、
action home にparams[:id]が渡っていないので、action home を呼んでいるview、そのviewを書き出しているactionも載せてください
ありがとうございます。やはりparams[:id]が取得できていないのですね!devise?よくわからないので今からググります!教えてくださりありがとうございます〜
この場合、timetableコントローラーも絡んでくるのですね!
winerboumさん、そのviewを書き出しているアクションというのがよくわかりませんでした。どこかのコントローラーのことですか??すみません...
うおお予想外なことにtimetablesコントローラーのcreateアクションが空じゃないですか..!
たぶんですが、submitボタンを押したときにエラーになるのではなくて、そもそもhome画面自体が表示できていない、ということですかね。。
確認ですが、deviseを使用しない方向で開発を進めるとしたらログイン認証はどうやって行いますか??
(deviseを使うのであれば、最初は覚えることがたくさんあって大変ですが、一気に解決には近づくと思います。)
>そのviewを書き出しているアクション
はい、controllerのmethodです
返事がおれくれて申し訳ないです!
siruku6さん、
そうなんです。サブミットボタンを押す以前に画面が表示されません!
お二方へ。
私のプログラミングに対する理解が浅いので、アプリケーション全体をみた方が早いと思ったので、githubにpushしました!多分みれると思います!
https://github.com/frisk-peppermint/portfolio
いろいろ汚いと思いますがよろしくお願いいたします!
あと、お気づきかもしれませんが、このアプリケーションはrails tutorialを拡張した物です!
回答1件
あなたの回答
tips
プレビュー