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

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

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

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

Ruby on Rails 6

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

720閲覧

Railsで検索機能を作り発生したエラーno implicit conversion of nil into Stringの解決方法を教えてください

aomomo123

総合スコア19

Ruby

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

Ruby on Rails 6

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/10/01 12:54

編集2021/10/02 15:41

前提・実現したいこと

Railsでネットのコードを参考にしながら検索機能を作っています。
まず検索に一致したユーザーとそのリンクを表示し、リンクを押してユーザーの今までの投稿一覧を表示できるようにしたいのですが、エラーが発生しています。

発生している問題・エラーメッセージ

TypeError in SearchsController#search
no implicit conversion of nil into String

該当のソースコード

route.rb

Rails.application.routes.draw do devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations', } # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'homes#top' get 'mypage', to: 'homes#mypage' resources :posts, only: [:create, :new, :edit, :update, :destroy] get '/posts/index', to:'posts#index' get '/search', to: 'searchs#search' get '/userpage', to: 'searchs#search' resources :posts, except: [:index] do resource :bookmarks, only: [:create, :destroy] end end

searchs_controller.rb

class SearchsController < ApplicationController def search @content = params["content"] @users = User.where('name LIKE ?', '%'+@content+'%') @posts = Post.where('body LIKE ?', '%'+@content+'%') end private def search_for(model, content, method) if model == 'user' if method == 'perfect' User.where(name: content) else User.where('name LIKE ?', '%'+content+'%') end elsif model == 'post' if method == 'perfect' Post.where(body: content) else Post.where('body LIKE ?', '%'+content+'%') end end end end

search.html.erb

<% if @users.present? && @posts.present? %> <h3>【Users,Postsモデルの検索結果】検索ワード:<%= @content %></h3> <h4>・ユーザー名</h4> <%= render 'posts/users', users: @users %> <h4>・投稿内容</h4> <%= render 'posts/search_index', posts: @posts %> <% elsif @users.present? && @posts.empty? %> <h3>【Usersモデルの検索結果】検索ワード:<%= @content %></h3> <h4>・ユーザー名</h4> <%= render 'posts/users', users: @users %> <% elsif @users.empty? && @posts.present? %> <h3>【Postsモデルの検索結果】検索ワード:<%= @content %></h3> <h4>・投稿内容</h4> <%= render 'posts/search_index', posts: @posts %> <% else %> <h3>検索ワード:<%= @content %>に該当はありません</h3> <% end %> ``` _users.html.erb ``` <% users.each do |user| %> <%= link_to userpage_path(user) do %> <%= user.name %><br> <% end %> <% end %> ``` _userpage.html.erb ``` <table> <thead> <tr> <th>投稿者名</th> <th>本文</th> <th></th> <th></th> </tr> </thead> <tbody id="user"> <% @posts.each do |post| %> <tr> <td><%= post.user.name %></td> <td><%= post.body %></td> <% if post.user == current_user %> <td><%= link_to "編集", edit_post_path(post) %></td>        <td><%= link_to "削除", post_path(post), method: :delete, remote: true %></td> <% else %> <td></td> <td></td> <% end %> </tr> <% end %> </tbody> </table> ``` _form.html.erb ``` <% if user_signed_in? %> <%= form_tag(search_path, method: :get) do %> <%= text_field_tag 'content' %> <%= submit_tag '検索' %> <% end %> <% end %> ``` エラーメッセージ Parameters: {"format"=>"2"} ### 試したこと @users = User.where('name LIKE ?', '%'+@content+'%') に問題がありそうなので、.to_s、||=を追加してみましたがうまく行きませんでした。 ### 補足情報(FW/ツールのバージョンなど) ruby 2.5.9 rails 6.1.4.1 mysql 5.6.35(MAMP 4.2.0)

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

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

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

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

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

neko_daisuki

2021/10/02 13:46

params["content"] が空なのではないでしょうか。 エラー画面の下の方に parameters というのがあるはずなので追記してください。 また、検索フォームを含む view も追記をお願いします。
aomomo123

2021/10/02 15:42

コメントありがとうございます。 情報を追加しました。 よろしくお願いいたします。
neko_daisuki

2021/10/02 15:46

エラー画面のアドレスバーに表示されるURLはどうなっていますか?
neko_daisuki

2021/10/02 15:48

parameters と route.rb から推測すると http://localhost:3000/search.2 となってしまうのですが、検索フォームの検索ボタンを押すとこの URL に遷移するのでしょうか?
neko_daisuki

2021/10/02 15:59

分かりました。今から回答を書きます。
guest

回答1

0

ベストアンサー

現在、/userpage.2 に対応しているルーティングは以下の行になります。

ruby

1 get '/userpage', to: 'searchs#search'

ここで to: 'searches#search' を指定しているのが変です。
searchs#search はユーザー情報を表示するためのものではなく、検索するためのアクションだからです。

一般に、ユーザー情報を表示するパスは /users/:id になり、アクションは show になります。

routes.rb

ruby

1get '/users/:id', to: 'users#show'

あとは、これに対応するコントローラーとビューを作成します。

app/controllers/users_controller.rb

ruby

1class UsersController < ApplicationController 2 def show 3 @user = User.find(params[:id]) 4 end 5end

app/views/users/show.html.erb

erb

1<%= @user.name %>

_users.html.erb の userpage_path も書き換えます

erb

1 <%= link_to user_path(user) do %>

こうすると生成されるリンクは /users/:id の形になります。

この修正例では userpage を users に変更しました。
どうしても /userpage/:id にしたいときはルーティングを以下のように変更してみてください。

ruby

1get '/userpage/:id', to: 'users#show'

以下のサイトの表はとても重要です。(写真をユーザーに置き換えて眺めてみてください)
CRUD、動詞、アクション / Railsガイド

投稿2021/10/02 16:24

neko_daisuki

総合スコア2090

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

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

aomomo123

2021/10/02 16:56

教えていただきありがとうございます。 修正したところ、 NoMethodError in Searchs#search undefined method `user_path' for #<ActionView::Base:0x00022505959328> が出てしまいました。 user_pathを使えるようにするにはどうすればいいでしょうか?
neko_daisuki

2021/10/02 17:05

ごめんなさい _path は routes.rb の内容から自動的に生成されるのですが、 get "hogehoge" の形式だと生成されないのを忘れていました。 get '/users/:id', to: 'users#show', as: 'user' のように as を指定してください。
aomomo123

2021/10/02 17:31

返信ありがとうございます。 教えて頂いた通りに修正したところ、解決しました。 なかなか解決できずに困っていたので、とても助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問