首页 > 解决方案 > 搜索嵌套资源

问题描述

我想知道是否可以搜索对象 ID。

理想情况下,我希望搜索重定向到对象编辑页面,但这是有问题的。我现在只是在索引页面上搜索以尝试仅显示搜索到的对象。

就目前而言,索引页面打开时会显示完整的集合对象,当在搜索栏中输入 ID 时会清除索引,但不会显示适当的对象。

这是我的控制器:

 def index
    @guests = @event.guests
    if params[:search]
      @search_term = params[:search]
      @guests = @event.guests.search_by(@search_term)
    end
  end

这是我的客人模型:

class Guest < ApplicationRecord
  belongs_to :event

  def self.search_by(search_term)
    where("(id) = :search_term", search_term: "%#{search_term}%")
  end
end

这是我的索引页:

<h3>Enter your ID here:</h3>
<%= form_for "", url: event_guests_path, role: 'search', method: :get do %>
<%= text_field_tag :search, @search_term, placeholder: "Enter ID here:" %>
<% end %>
<% @guests.each do |guest| %>
  <tr>
    <td> <%=guest.name %></td>
    <td> <%=guest.response %></td>
    <td><%= link_to 'Show', event_guest_path(@event, guest) %></td>
    <td><%= link_to 'RSVP', edit_event_guest_path(@event, guest) %></td>
    <td><%= link_to 'Remove Guest', [@event,guest], method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

如果需要更多代码,我将相应更新

提前致谢

标签: ruby-on-railssearchruby-on-rails-5

解决方案


You could have the controller, if you've done a search with a single result, redirect:

def index
  @guests = @event.guests
  if params[:search]
    @search_term = params[:search]
    @guests = @event.guests.search_by(@search_term)
  end

  if params[:search] && @guests.count == 1
    redirect_to edit_guests_path(@guest.first)
  end
end

Additionally, in your search_by function, you are currently generating sql that will look something like WHERE (id) = '%1234%', where you are using = to test not LIKE, or are adding %s to the string which are not needed. Either way, that explains getting no results. You probably want to change it to where("(id) LIKE :search_term", search_term: "%#{search_term}%") or where("(id) = :search_term", search_term: search_term). The later can be written in a more Rails-ish way: where(id: search_term).


推荐阅读