##今回
・投稿を検索する機能をつける。
・テストは後日改めて書きます。
##投稿検索について
・ログイン時にホームの画面に投稿検索ができるような形にする。
##実装
・投稿検索用のフォームを付けたいと思います。
<%= 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の処理を追加します。
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に挿入します。
<% 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 %>
・こんな感じです。終わりです。