これを行うにはいくつかの方法があります。
# with old hash syntax (all ruby versions)
@clients = Client.where(:name => params[:find_it])
# with new hash syntax (ruby 1.9)
@clients = Client.where(name: params[:find_it])
# with text query
@clients = Client.where('name = ?', params[:find_it])
それらはすべて同等です。
コードは、データベースからすべての@post = Client.all
クライアントに変数@post
を割り当ててから、完全に異なる値で 2 回再割り当てします。最後に、変数にはidが等しいレコードが割り当てられ、これがビューに表示されます。@post
Client
params[:id]
また、一般的にメソッドを使用する必要はありませんall
。次の点に注意してください。
Client.where(name: params[:find_it]).all.class
# => Array
Client.where(name: params[:find_it]).class
# => ActiveRecord::Relation
ActiveRecord::Relation
これは、他のクエリ方法でクエリできることを意味します。
@clients = Client.where(name: params[:find_it])
@favourite_clients = @clients.where(favourite: true)
Rails は何をすべきかを認識します (ActiveRecord::Relation
何かを行う必要があるまで、つまり、ビューで結果を反復するまでは処理しません)。そのためall
、コントローラーに配列が本当に必要な場合にのみ追加する必要があります。
@clients
の代わりに、より意味のある変数名を使用することも検討する必要があります@post
。
ソリューション全体に関しては、次のようになります。
# view
<%= form_for :find_it, :url => find_client_path do |n| %>
Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
<%= n.submit "Find" %>
<% end %>
form_for
ドキュメントを見てください。params[:find_it]
テキストが ではなくであることがわかりますparams[:find_it][:text]
。
:url
アクションへのパスにオプションを提供する必要がありますfind_it
。
インデックス ビューに結果を表示する場合は、次のようにします。
# view
<%= form_for :find_it do |n| %>
Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
<%= n.submit "Find" %>
<% end %>
# controller
def index
@clients = Client.scoped
@clients = @clients.where(:name => params[:find_it][:text]) if params[:find_it]
end