Techioz Blog

Ruby Sinatra ActiveRecord の基本検索

概要

Sinatra でシンプルな製品在庫アプリの基本的な検索機能を作成しようとしていますが、類似した名前を持つすべての製品を結果ページに適切に出力するためのコントローラーとビューを作成する方法がわかりません。

SearchPage.erb:

<フォームアクション=“/検索”、メソッド=“ポスト”>

コントローラ:

post '/search' do
@Products = Product.find_by(name: params[:product][:name])
@Products = Product.all(:name.like => "%#{params[:name]}%") #found this on another question
erb :"result"
end

結果.erb

<% @Products.each do |product| %>
<%=product.name %>
<%=product.details %>

編集:次のコードの提案に基づいて検索を機能させることができました。ありがとう!:

Search.erb ビュー

<form action="/search", method="get">
<input type="text" name="search">

コントローラ

get '/search' do
@products = Product.all
if params[:search]
  @products = Product.search(params[:search])
else
  @products = Product.all
end
erb :'results'
end

モデル

class Product < ActiveRecord::Base
def self.search(search)
where("name like ?", "%#{search}%")
end

Results.erb ビュー

<% if @products.present? %>
<table>
<td>Product Name</td><td>Company</td>
<% @products.each do |product| %>
<tr><td><a href="/products/<%= product.id %>"><%=h product.name %></a>   </td>
<td><%=h product.company.name %></td>
<% end %>
<% else %>
<p>There are no Products containing the term(s) <%= params[:search] %>.</p>
<% end %>
</table>

解決策

POST メソッドを使用していることに気づきました。製品の検索機能を作成する簡単な方法があります。これを試して:

ポストコントローラー:

@products = Product.all
if params[:search]
  @products = Product.search(params[:search]).order("created_at DESC")
else
  @products = Product.all.order('created_at DESC')
end

Posts モデル (注: SQLite を使用している場合は、LIKE のままにしておきます。Postgres を使用している場合は、LIKE を ILIKE に変更します)

def self.search(search)
  where('name like :pat or content like :pat', :pat => "%#{search}%")
end

検索フォーム (Result.erb に入れて必要に応じて編集しますが、get メソッドとして保持します。個人的にはフォーム ヘルパーを使用するのが好きですが、必要に応じて通常のフォームを作成することもできます)

<%= form_tag(products_path, :method => "get", id: "search-form") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
<%= submit_tag "Search" %>
<% end %>

レンダリング結果

<% if @products.present? %>
  <%= render @products %>
<% else %>
  <p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>

これがうまくいくかどうか教えてください。そうでない場合は、もう少し助けてみます。