以过滤器形式复制时显示一个型号名称

时间:2019-08-02 21:02:57

标签: javascript ruby-on-rails ruby model-view-controller filter

我这里有用于名称标记的过滤器。我想做的是,如果我有一个以上的标志名称来删除其他enter image description here

检查附带的图像。我有两个Serfer名字。我只想显示一个

请帮助我!谢谢

<div class="categories">
      <% @oferta.each do |o| %>
        <ul class="cat">
          <li class="pull-left"><h2><%= link_to o.offer,o %></h2><br><h4><%= o.description %></h4>
            <div class="main">
              <% if o.sigs.exists? %>
                <div id="myBtnContainer">
                  <button class="btn active"  onclick="filterSelection('o')">All</button>
                  <% for item in o.sigs %>
                    <button class="btn"  onclick="filterSelection('<%= item.name %>')"><%=  item.name%><br></button>
                  <% end %>
                </div>
                <div class="row">

                  <% for item in o.sigs %>
                    <div class="column <%= item.name %>">
                      <div class="content">
                        <%= image_tag item.image.url(), style: "width:100%"%>
                        <h4><br><%=link_to item.name,item %></h4>
                        <p><%= item.comment %></p>    
                      </div>
                    </div>
                  <% end %><br><br>
                </div>
              <% end %><br>
            </div>
          <% end %>
</div>

这是oferta_controller.rb

class OfertaController < ApplicationController
  before_action :find_ofertum, only: [:destroy,:edit,:update,:show]
  def new
    @ofertum= Ofertum.new
  end

  def create
    @ofertum= Ofertum.new(ofertum_attributes)
    if @ofertum.save
      redirect_to oferta_path, notice: "Thank you... Your offer was created successfully."
    else
      flash.now[:error] = "Please correct the form"
      redirect_to new_ofertum_path
    end
  end
  def index
    @oferta = Ofertum.all
  end

  def show
    @ofertum = Ofertum.find(params[:id])
    @sig = @ofertum.sigs.build
  end
  private
  def ofertum_attributes
    ofertum_attributes = params.require(:ofertum).permit([:offer,:description,:sign,:place,:sig])
  end
  def find_ofertum
    @ofertum = Ofertum.find(params[:id])
  end

end

在铁塔模型中

class Ofertum < ApplicationRecord
  has_many :sigs
end

在信号模型中

class Sig < ApplicationRecord
  belongs_to :ofertum
end

2 个答案:

答案 0 :(得分:1)

在您的控制器中,创建一个包含所有@sigs的新sigs变量,因此

@sig_names = []
@sigs_names = Ofertum.all.each do |ofertum|
  ofertum.sig.each do |sig| 
    @sig_names << sig.name
  end
end

编辑,可能有更好的方法来检索它,但我想不出rn:D

并使用它来创建过滤器栏。 因此,与其在@oferats内部执行for循环,不如在@sig_cards上进行迭代以生成搜索栏。 然后通常在第二个循环中遍历@ofertas来创建卡片。

删除代码的这一部分

<% if o.sigs.exists? %>
    <div id="myBtnContainer">
      <button class="btn active" onclick="filterSelection('o')">All</button>
         <% for item in o.sigs %>
           <button class="btn"  onclick="filterSelection('<%= item.name %>')"><%=  item.name%><br></button>
         <% end %>
   </div>

改为执行此操作:

<div id="myBtnContainer">
   <button class="btn active"  onclick="filterSelection('o')">All</button>
      <% @sig_names.each do |sig_name| %>
         <button class="btn"  onclick="filterSelection('<%= sig_name %>')"><%=  sig_name %><br></button>
       <% end %>
</div>

此外,您还可以在代码中使用for循环,效果很好,对ruby来说不是很惯用。 .each还有更多。

答案 1 :(得分:1)

<% if o.sigs.exists? %>
                <div id="myBtnContainer">
                 <button class="btn active"  onclick="filterSelection('o')">All</button>
                    <% o.sigs.pluck(:name).uniq.each do |name| %>
                  <button class="btn"  onclick="filterSelection('<%= name %>')"><%= name %><br></button>
              <% end %>

这是我的问题的答案,方法是添加此pluck(:name).uniq