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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

解決済

1回答

489閲覧

検索結果を表示させたい

haru_ren

総合スコア48

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/13 04:40

お世話になっております。

現在、railsでインスタグラムクローンアプリを開発しており、投稿内容(contentカラム)を検索し結果を表示するコードを書いているのですが、検索結果を表示できず、詰まっております。

_search.html.erbファイル8行目の後に<% binding.pry %>を挟んでデバックしたところ、@postsには正常に検索結果が入っておりました。

何卒、よろしくお願いいたします。

<% binding.pry %>なしで実行した際のエラー
イメージ説明

_search.html.erb <% binding.pry %>あり

<p>検索</p> <%= form_tag(search_path,:method => 'get') do %> <%= text_field_tag :search %> <%= submit_tag 'Search', :content => nil %> <% end %> <% if @posts.present? %> <% @posts.each do |post| %> <% binding.pry %> <%= post.content %> <% end %> <% end %>

<% binding.pry %>ありで実行したログ

[1] pry(#<#<Class:0x00007f9ce619fed0>>)> @posts => [#<Micropost:0x00007f9ce61b45d8 id: 11, content: "u", user_id: 1, created_at: Sat, 12 Sep 2020 13:57:33 UTC +00:00, updated_at: Sat, 12 Sep 2020 13:57:33 UTC +00:00>, #<Micropost:0x00007f9ce61b44e8 id: 10, content: "u", user_id: 1, created_at: Sat, 12 Sep 2020 13:21:09 UTC +00:00, updated_at: Sat, 12 Sep 2020 13:21:09 UTC +00:00>]

MicropostsController

class MicropostsController < ApplicationController before_action :authenticate_user!, only: [:create, :destroy] before_action :correct_user, only: :destroy def create @micropost = current_user.microposts.build(micropost_params) @micropost.image.attach(params[:micropost][:image]) if @micropost.save flash[:success] = "Micropost created!" redirect_to root_url else @feed_items = current_user.feed.paginate(page: params[:page]) render 'pages/top' end end def destroy @micropost.destroy flash[:success] = "Micropost deleted" redirect_to request.referrer || root_url end def search #Viewのformで取得したパラメータをモデルに渡す @posts = Micropost.search(params[:search]) render 'pages/top' #binding.pry end private def micropost_params params.require(:micropost).permit(:content, :image) end def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to root_url if @micropost.nil? end end

micropost.rb

class Micropost < ApplicationRecord #mount_uploader :image, ImageUploader belongs_to :user has_one_attached :image default_scope -> { order(created_at: :desc) } validates :user_id, presence: true validates :content, presence: true, length: { maximum: 140 } validates :image, content_type: { in: %w[image/jpeg image/gif image/png], message: "must be a valid image format" }, size: { less_than: 5.megabytes, message: "should be less than 5MB" } # 表示用のリサイズ済み画像を返す def display_image image.variant(resize_to_limit: [500, 500]) end def self.search(search) return Micropost.all unless search Micropost.where(['content LIKE ?', "%#{search}%"]) end end

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

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

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

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

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

guest

回答1

0

ベストアンサー

_micropost_form.html の2行めで _error_messages.htmlをrenderしていますが、そこで object を渡していない、もしくは nilを渡したためのエラーです。

これでわからない場合は、添付されているエラー画面の中程 Requestの上にリストされているfileを載せてください

投稿2020/09/13 07:30

winterboum

総合スコア23284

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

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

haru_ren

2020/09/13 09:04

ご回答ありがとうございます! エラーの原因は理解できたのですが、解決できませんでした。 ご教授いただけないでしょうか。 よろしくお願いいたします。 _micropost_form.html.erb ``` <%= form_with(model: @micropost, local: true) do |f| %> <%= render 'shared/error_messages', object: f.object %> <span class="image"> 写真を投稿しよう!<br> <%= f.file_field :image, accept: "image/jpeg,image/gif,image/png" %> </span> <div class="field"> <%= f.text_area :content, placeholder: "Compose new micropost..." %> </div> <%= f.submit "Post", class: "btn btn-primary" %> <span class="image"> <%= f.file_field :image, accept: "image/jpeg,image/gif,image/png" %> </span> <% end %> <script type="text/javascript"> $("#micropost_image").bind("change", function() { var size_in_megabytes = this.files[0].size/1024/1024; if (size_in_megabytes > 5) { alert("Maximum file size is 5MB. Please choose a smaller file."); $("#micropost_image").val(""); } }); </script> ``` _error_messages.html.erb ``` <% if object.errors.any? %> <div id="error_explanation"> <div class="alert alert-danger"> The form contains <%= pluralize(object.errors.count, "error") %>. </div> <ul> <% object.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> ```
winterboum

2020/11/19 22:59

<%= form_with(model: @micropost, local: true) do |f| %> <%= render 'shared/error_messages', object: f.object %> の f.object がNilって言われてますから、 @micropos が怪しいですね。 これはどうやって準備してますか? それと コメント欄はcode読みにくいので質問欄を編集してそちらに移してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問