1

请不要大喊大叫...我正在尝试运行搜索查询以在数据库中查找名字,基本上是在尝试查找特定用户然后显示该用户。

在控制台中起作用的是 Client.where 但我似乎无法让它在控制器中起作用。

irb(main):001:0>client = Client.where("name = 'Dusty'")
Client Load (0.4ms)  SELECT `clients`.* FROM `clients` WHERE (name = 'Dusty')

我有的是。

一个视图'index.html.erb':

<%= form_for :find_it do |n| %>
   Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
<%= n.submit "Find" %>

还有clients_controller.rb中的一个控制器方法:

def find_it
  @post = Clients.all
  @post = Client.where("name = ", params[:find_it])
  @post = Client.find(params[:id])
end

任何援助将不胜感激。

4

3 回答 3

4

你的语法有点不对劲。使用散列式条件:

def find_it
  @post = Client.where(:name => params[:find_it])
  # @post = Client.find(params[:id]) # why is this line here? It overwrites previous results
end
于 2013-01-30T07:15:42.927 回答
3

有几种方法可以做到这一点:

# 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 等于的记录,这就是您将在视图中获得的内容。@postClientparams[: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
于 2013-01-30T08:21:16.273 回答
2

代替

@post = Client.where("name = ", params[:find_it])

@post = Client.where("name = ?", params[:find_it])
于 2013-01-30T07:23:46.953 回答