LoginSignup
0
0

More than 3 years have passed since last update.

投稿を検索する機能

Posted at

今回

・投稿を検索する機能をつける。
・テストは後日改めて書きます。

投稿検索について

・ログイン時にホームの画面に投稿検索ができるような形にする。

実装

・投稿検索用のフォームを付けたいと思います。

app/views/shared/_microposts_search_form.html.erb
<%= search_form_for @q, url: @url do |f| %>

<%= f.label :content_cont, '投稿検索' %>

<div class = "input-group">
  <%= f.text_field :content_cont, placeholder: "キーワードで検索...。"%>
  <%= f.submit '検索' %>
</div>

<% end %>

・検索条件のcontent_contはMicropostのcontentからの検索です。
・ユーザー検索フォームと違うのは、url: @urlの部分です。
・投稿検索時に、urlを指定しなければ、検索実行時にエラーが出てしまいます。(エラーの詳細は割愛)


・検索フォームが完成したので、次にcontrollerの実装に移ります。
・ホーム画面のフィードを検索するためにstatic_pages_controllerのhomeアクションに処理を加えます。

app/controllers/static_pages_controller

def home
    if logged_in?
     @micropost = current_user.microposts.build 
     if params[:q] && params[:q].reject { |key,value| value.blank? }.present?
       @q = current_user.feed.ransack(microposts_search_params)
       @feed_items = @q.result.paginate(page: params[:page])
     else
       @q = Micropost.none.ransack
       @feed_items = current_user.feed.paginate(page: params[:page])
     end
     @url = root_path
    end
  end


・microposts_search_paramsは、applicationControllerに設置しました。

app/controllers/application_controller

#投稿検索機能
  def microposts_search_params
    params.require(:q).permit(:content_cont)
  end


・micropostControllerのcreateアクションに@qとransackの処理を追加します。

app/controllers/microposts_controller.rb

def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "投稿完了"
      redirect_to root_url
    else
      @q = Micropost.none.ransack
      @feed_items = current_user.feed.paginate(page: params[:page])
      render'static_pages/home'
    end
  end

・追加するのは投稿が失敗した際の処理のみです。
・失敗した場合だけmicropostContorollerからホームのviewをrender(redirect_toではなく)しているた め、@qが必要になります。


・viewに戻って最初に作った_microposts_search_form.html.erbをhomeに挿入します。

app/views/static_pages/home.html.erb
<% provide(:title,"ホーム") %>

<h1>ホームページ</h1>
<p>パパっ子</p>

<h1>解決した投稿</h1>

<% if logged_in? %>

  <section class = "user_info">
    <%= render'shared/user_info' %>
  </section>

  <section class = "micropost_form">
    <%= render'shared/micropost_form' %>
  </section>

  <h3>投稿</h3>
  <div class="search_form">
  <%= render 'shared/microposts_search_form' %>
 </div>
  <%= render 'shared/feed' %>

<% end %>

・こんな感じです。終わりです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0