有几种方法可以做到这一点:
# 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
,然后您使用完全不同的值重新分配两次。最后,您的变量被分配了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