前説
初めまして、Rubyもう2ヶ月経っていた初心者です。
以前、タグ機能実装の話をさせていただきました。それから色々といじっていたので、ここで報告しようかと思います。完全に僕が考え抜いて実装した機能なので、親心が芽生えます。
他タグに関する内容はこちら。
実装した機能
マイページ編集にて登録したタグを、タイムラインで自動で表示させて、そのタグの検索結果を非同期で閲覧できる機能。
多分意味がわかんねえという方に動画でお教えします。
マイページでは以下のようにタグを登録できます。
products_controller.rb
def index
#標準タグの時のツイートを探し出す
@products = Product.order("created_at DESC").page(params[:page]).per(10)
if user_signed_in?
#create時にいいねを生成するインスタンス
@likes = Like.new(user_id: current_user.id, product_id: params[:product_id])
#destroy時にいいねをテーブルから探し出す
@like = Like.find_by(user_id: current_user.id)
#ここから大事
#@tag -> ユーザーの持つタグ情報
@tag = User.find(current_user.id).tag_list
#配列を用意
@tag_products = []
#一つずつタグ情報に関連するツイートを探し出す
@tag.each do |a_tag|
@tag_products << Product.tagged_with(a_tag)
end
end
end
上記はコントローラーのコードです。
結局、@tag_productsには固有のタグ情報を持つツイート達が入ってます。
index.html.erb
<% if user_signed_in? %>
<% split_number = 12 / (@tag.count+1) %>
<% @tag.each do |tag| %>
<% @tag_number = @tag.index("#{tag}").to_i %>
<li class="tab col s<%= split_number %>"><a href="#test<%= @tag_number + 2 %>"><%= tag %></a></li>
<% end %>
<li class="tab col s<%= split_number %>"><a class="active" href="#test1">標準</a></li>
<% end %>
上記のコードでは、上の切り替えタブが登録したタグの数に応じて、幅が合うようにコードを書きました。
index.html.erb
<% n = 2 %>
<% @tag_products.each do |a_tag| %>
<div class="page" id ="test<%= n %>">
<%= render 'products/index_to_product' , products: a_tag %>
<% n += 1 %>
</div>
<% end %>
上記のコードでは、中身の応じてタグの検索結果とそのツイート内容が表示されるように書きました。ここが、当初うまくいかず、ツイートのタグと検索内容が相違が生じていました。
nを使ったり、あまり綺麗なコードではないなと個人的に思っているので、まさかりなどあれば・・・。
test1は標準タブなので、タグ検索タブはtest2~となります。そのため、nは2が初期値となっています。
終わりに
アルゴリズムを少し考えるのに苦戦したので、Rubyをもう少し書けるようにしないといけないなと思いました。