やすまんの技術ブログ

駆け出しエンジニアが日々学んだこと、わからなかったことなどをまとめておくブログ。忘備録としても使います。

no method errorが出たとき

結論

ファイルの命名規則に沿って、記述がしてなかったため。

 

経緯

rspecを用いてコントローラのテストを実施しようとした。

 

bundle exec rspec spec/controller/messages_controller.rb

 

をターミナルで実施すると

f:id:yasuMen:20200107193011p:plain

 

また、スペルミスかー

 

おや、間違ってないぞ。

 

そのほかのコードに記述漏れやミスがないか確認。

 

半角と全角の確認。

 

それでも解決できなかった。

 

https://qiita.com/ryotakazawa/items/d03226a8dc136ebf15af

https://qiita.com/okuramasafumi/items/af427c90973486f3c7f7

https://matt-note.hatenadiary.jp/entry/2018/10/20/203736

 

これらの記事を参考に、記述を修正したりしたものの解決できなかった。

 

よく見たら、ビジュアルコード でのフォルダの

spec/controller/message_scontroller_spec.rb

担っているではないか。

 

なので、controllersに変更。

f:id:yasuMen:20200107193405p:plain

 

その後bundle exec ~~

 

f:id:yasuMen:20200107193541p:plain

 

無事解決しました。

rails はファイルの命名規則が厳しいので、しっかり確認をする。

no method errorが出たとき

結論

ファイルの命名規則に沿って、記述がしてなかったため。

 

経緯

rspecを用いてコントローラのテストを実施しようとした。

 

bundle exec rspec spec/controller/messages_controller.rb

 

をターミナルで実施すると

f:id:yasuMen:20200107193011p:plain

 

また、スペルミスかー

 

おや、間違ってないぞ。

 

そのほかのコードに記述漏れやミスがないか確認。

 

半角と全角の確認。

 

それでも解決できなかった。

 

https://qiita.com/ryotakazawa/items/d03226a8dc136ebf15af

https://qiita.com/okuramasafumi/items/af427c90973486f3c7f7

https://matt-note.hatenadiary.jp/entry/2018/10/20/203736

 

これらの記事を参考に、記述を修正したりしたものの解決できなかった。

 

よく見たら、ビジュアルコード でのフォルダの

spec/controller/message_scontroller_spec.rb

担っているではないか。

 

なので、controllersに変更。

f:id:yasuMen:20200107193405p:plain

 

その後bundle exec ~~

 

f:id:yasuMen:20200107193541p:plain

 

無事解決しました。

rails はファイルの命名規則が厳しいので、しっかり確認をする。

expected ["を入力してください"] to include "must exist"について

結論

"must exist"を"入力してください"に変更してねという意味

 

経緯

まずなぜこのエラーが出たのかというと、

expect(message.errors[:text]).to include("must exist")

と入力していたから。

実は、テストコードを入力する前に、jayamlをインストールしていたことで

include(エラーを返す言葉)を日本語表記にしないといけなかった。

なので、

expect(message.errors[:text]).to include("を入力してください")

にすれば解決することができる。

 

 

discribe/context/it/expectについて

テストはだいたい型が決まっているので、何を書けば良いのかを確認できるように忘備録として残しておきます。

 

  • describeは何をテストするのか
  • contextはどのような条件でテストをするのか
  • itは何をアウトプットするのかを記述する。
  • expectはこうなってほしいなぁという期待を意味する

 

 

ビューが思い通りに表示されない

グループ編集機能を実装後、動作確認のため、

変更ボタンを押したら、違うビューファイルに飛んでしまった。

 

理由

=link_toで飛ばす場所を間違えてしまっていた。

本来は

= link_to edit_group_path(@group) do 

 

とするべきところを

 

= link_to edit_users_path(@group) do 

と記述してしまった。

確認方法

rake routesをしてルーティングを確認する。

 

               edit_user GET    /users/:id/edit(.:format)            users#edit

                    user PATCH  /users/:id(.:format)                 users#update

                         PUT    /users/:id(.:format)                 users#update

          group_messages GET    /groups/:group_id/messages(.:format) messages#index

                         POST   /groups/:group_id/messages(.:format) messages#create

                  groups POST   /groups(.:format)                    groups#create

               new_group GET    /groups/new(.:format)                groups#new

              edit_group GET    /groups/:id/edit(.:format)           groups#edit

 

 

 

 rake routes について

rake routesをすると

 

root GET    /                                    groups#index

                   users GET    /users(.:format)                     users#index

                         POST   /users(.:format)                     users#create

               edit_user GET    /users/:id/edit(.:format)            users#edit

 

(一部抜粋)

 

となるが、一番上のroot GET    /                                    groups#index

の「/」は「root」という意味になる。

今回はresoucesを使用してrakeroutesをしているので、prefixが適用されるので必ず「_path」をつけなければいけない。

したがって一番上の場合はroot_pathとなる。

2番目はusers_root_pathになる。

Couldn't find Group with 'id'= の解決方法

メッセージ送信機能を実装中に発生。

 

結論

routes.rbで入れ子構造にしていなかったから。

 

経緯

Couldn't find Group with 'id'=

の意味は、グループI'dが持ってこれないよと言っている。

ということは、

  • データベースに「group_id」の記述がない
  • コントローラに問題がある。

のどちらかに絞られると考えました。

データベースには記述はあったので、データベースに「group_id」が存在することがわかった。

コントローラに記述ミスがないか確認し、あまり関係のないところではあるがミスがあったのでそこを修正し、再度リロードしたが結果は変わらない。

 

なので、

byebug pryをしてコントローラの動きを止めて、もう一度確認すると、

group_idの値がnilになっていた。

そしてrake routesをターミナル上でかけてみると、

そもそもgroup_idに関する記述がないことがわかった。

これにより、ルーティングがおかしいことに気づく。

ルーティングを見てみると、今回の場合、

messagesの中にgroupがあるため、入れ子構造にしないといけないのだが

  resources :groupsonly: [:new:create:edit
:update
    resources :messagesonly: [:create:index]
 

 

doとendが抜けているではないか!

 

したがって

  resources :groupsonly: [:new:create:edit
:updatedo
    resources :messagesonly: [:create:index]
  end

 

にしてあげれば解決でき流ということです。