LoginSignup
1
1

More than 5 years have passed since last update.

RubyOnRailsのタグ機能を応用した少し便利なトップページ

Last updated at Posted at 2018-05-05

前説

初めまして、Rubyもう2ヶ月経っていた初心者です。
以前、タグ機能実装の話をさせていただきました。それから色々といじっていたので、ここで報告しようかと思います。完全に僕が考え抜いて実装した機能なので、親心が芽生えます。
他タグに関する内容はこちら

実装した機能

マイページ編集にて登録したタグを、タイムラインで自動で表示させて、そのタグの検索結果を非同期で閲覧できる機能。

多分意味がわかんねえという方に動画でお教えします。

gif_tag.gif

マイページでは以下のようにタグを登録できます。

IMG_6226.JPG

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をもう少し書けるようにしないといけないなと思いました。

1
1
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
1
1