【rails】同じ商品を探して表示させる方法

プログラミング

railsで商品名や値段が同じ商品だけを絞って表示させたいなんてことがあると思います。

英語で調べて結構時間がかかったので、記載していきます。

 

同じ商品を探して表示させる方法

これをするにはcontrollerとviewにコーディングする必要がありますよね。

まずはviewsについて

<div class= “col-sm-6”>
 <div>
  <h2><%= @post.title %>
  <p>アプリ・サイト名:<%= @post.channel %>
  <p>¥ <%= @post.price %>
  <p><%= @post.content %>
  <p><%= 5 – @post.counter %>
 </div>
<% if @post.user == current_user %>
 <%= link_to “編集”, edit_post_path(@post) %>
<% end %>
<% if @post.counter < 5 %>
 <%= link_to “戻る”, attensions_path %>
 <% else %>
<%= link_to “戻る”, root_url %>
<% end %>
<div class= “attenssions”>
<% if @post.user == current_user %>
 <% if @post.counter < 5 %>
  <%= form_for(@post, url:{controller:’posts’, action: ‘update’}) do |f| %>
   <%= f.submit “商品を目立たせる”, name: “promote” %>
  <% end %>
 <% end %>
<% end %>
</div>
</div>

<div class = “col-sm-12 comp”>
 <h3 class = “h3-cas”>同じ商品</h3>
 <% @same.each do |post| %>
  <%= link_to(post) do %>
   <div class = “col-sm-3”>
    <div class = “posts”>
     <div class = “image”>
      <%= image_tag(post.image.url, class: “img-responsive”) unless post.image.blank? %>
     </div>
     <div class = “description”>
      <ul class = “list-unstyled”>
       <li class = “title”><%= post.title %></li>
       <li class = “price”>¥ <%= post.price %></li>
      </ul>
     </div>
    </div>
   </div>
  <% end %>
 <% end %>
</div>

【解説】

<% @same.each do |post| %>

こちらのsame←なんでもいいです。

each do |○○| は 順番に○○させる(postは配置する)

なので、ここにsameという名前のついたものを順番に配置せよという命令になります。

これだけでは何をここに配置したいのか理解できないので

controllerに書いてあげる必要があります。

 

controllerについて

@same = Post.all.select { |x| x[“title”] == @post.title }
@same.delete_if { |h| h[“id”] == @post.id}

こちらを

def の中に記入して頂くだけで大丈夫です。

【解説】

上記を分解すると

@same は名前の定義です。sameはどんな働きをするのか=以降に書いています。

Post.all.selectは{}の中のものを全部のpostの中から探してね。

という命令です。

{ |x| x[“title”] == @post.title }は|x|でxというものを定義しています。(探したいのはxですよと宣言してるんですね)。

それからx[“title”]。こちらはxのタイトルという意味です。

x[“title”]は→ == @post.title(つまり上にある@post.titleとxのタイトルが同じ時という意味です。)

なので、

@same = Post.all.select { |x| x[“title”] == @post.title }は上にある@post.titleとxのタイトルが同じ時に@sameの場所に配置するという意味です。

 

これで@sameに配置したいものを教えてあげることができたのでうまくいきます。

もし何か不具合があれば、お問い合わせください。

気づいたらすぐに返信いたします。