【问题标题】:Unable to get simple ruby on rails Search to work :/无法在 Rails Search 上获得简单的 ruby​​ 工作:/
【发布时间】:2011-02-14 21:28:26
【问题描述】:

我是 RoR 的新手,任何帮助将不胜感激 :)
我有一个基本的脚手架 CRUD 应用程序来添加客户。
我正在尝试按 first_name 或 last_name 字段进行搜索。

我得到的错误是:

客户端中的 NoMethodError#find 当你没想到时,你有一个 nil 对象! 您可能期望有一个 Array 的实例。 评估 nil.each 时发生错误

提取的源代码(第 9 行附近):

6:     <th>Apellido</th>
7:     </tr>
8: 
9:   <% for cliente in @clientes %>
10:   <tr>
11:     <td><%=h cliente.client_name %></td>
12:     <td><%=h cliente.client_lastname %></td>

应用程序跟踪

C:/Rails/clientes/app/views/clientes/find.html.erb:9:in `_run_erb_app47views47clientes47find46html46erb'

我在 controllers/clientes_controlee.rb 中的查找函数是:

# Find
def find
  @cliente = Cliente.find(:all, 
  :conditions=>["client_name = ? OR client_lastname = ?", params[:search_string], params[:search_string]])

end

我的视图/布局clientes.html.erb 表单代码片段是:

<span style="text-align: right">
<% form_tag "/clientes/find" do %>
<%= text_field_tag :search_string %>
<%= submit_tag "Search" %>
<% end %>
</span>

我在views/clientes/find.html.erb中创建的搜索模板:

<h1>Listing clientes for <%= params[:search_string] %></h1>

<table>
<tr>
<th>Nombre</th>
<th>Apellido</th>
</tr>
<% for cliente in @clientes %>
<tr>
<td><%=h cliente.client_name %></td>
<td><%=h cliente.client_lastname %></td>
<td><%= link_to 'Mostrar', cliente %></td>
<td><%= link_to 'Editar', edit_cliente_path(cliente) %></td>
<td><%= link_to 'Eliminar', cliente, :confirm =>'Estas Seguro de que desear eliminar a   este te cliente?', :method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'Atras', clientes_path %>

开发日志

处理 ClientesController#index (for 127.0.0.1 at 2010-05-02 22:14:29) [GET] [4;36;1mCliente 负载 (1.0ms)[0m [0;1mSELECT * FROM "clientes" [0m 在布局/客户端中渲染模板 渲染客户端/索引 在 28 毫秒内完成(查看:19,DB:1)| 200 OK [http://localhost/clientes]

处理 ClientesController#src(2010-05-02 22:14:36 为 127.0.0.1)[POST] 参数:{"search_string"=>"eduardo calvachi", "commit"=>"Search", "authenticity_token"=>"mSaFeUAWdIWBNPkTufX2hdx7NaMaGfLSp1h78nTB7Ns="}

NoMethodError (你有一个 nil 对象,但你没想到它! 您可能期望 ActiveRecord::Base 的实例。 评估 nil.[]) 时发生错误: app/controllers/clientes_controller.rb:88:in `src'

渲染救援/_trace (48.0ms) 渲染救援/_request_and_response (0.0ms) 渲染救援/布局(internal_server_error)

处理 ClientesController#src(2010-05-02 22:20:28 为 127.0.0.1)[POST] 参数:{"search_string"=>"eduardo calvachi", "commit"=>"Search", "authenticity_token"=>"mSaFeUAWdIWBNPkTufX2hdx7NaMaGfLSp1h78nTB7Ns="}

NoMethodError (你有一个 nil 对象,但你没想到它! 您可能期望 ActiveRecord::Base 的实例。 评估 nil.[]) 时发生错误: app/controllers/clientes_controller.rb:88:in `src'

渲染救援/_trace (92.0ms) 渲染救援/_request_and_response (1.0ms) 渲染救援/布局(internal_server_error)

处理 ClientesController#src(2010-05-02 22:36:12 为 127.0.0.1)[POST] 参数:{"search_string"=>"eduardo calvachi", "commit"=>"Search", "authenticity_token"=>"mSaFeUAWdIWBNPkTufX2hdx7NaMaGfLSp1h78nTB7Ns="}

NoMethodError (你有一个 nil 对象,但你没想到它! 您可能期望 ActiveRecord::Base 的实例。 评估 nil.[]) 时发生错误: app/controllers/clientes_controller.rb:88:in `src'

渲染救援/_trace (39.0ms) 渲染救援/_request_and_response (0.0ms) 渲染救援/布局(internal_server_error)

【问题讨论】:

  • 您的 routes.rb 文件是否有此操作的定义?
  • 在您的 find 方法中,@cliente 应该是 @clientes...
  • 嗨 Lowgain,我只有默认路由: ActionController::Routing::Routes.draw do |map| map.resources :clientes 和 map.connect ':controller/:action/:id' 和 map.connect ':controller/:action/:id.:format'
  • clientes controller 的第 88 行你有什么?
  • 稍微跑题了——如果你只用英语开发,然后使用 Rails 国际化模块 (i18n) 翻译成其他语言,你会遇到更少的麻烦。

标签: ruby-on-rails search


【解决方案1】:

@clientes 显然是 nil 元素。

尝试将您的代码放入索引中,因为您可能将其作为 restful 资源,或者 find 可能是保留名称。

将控制器中的定义更改为以下内容:

def index
  params = params[:search_string]
  @clientes = Cliente.find(:all, :conditions=>["client_name = ? OR client_lastname = ?",params, params)
end

顺便说一句 - 确保您的索引视图中有旧的查找视图。

【讨论】:

  • Sam,感谢您的建议,我将 find def 替换为您的 index def,然后我将 更改为 但我现在什至无法运行 /clientes。我收到一个 noMethod 错误 C:/Rails/clientes/app/controllers/clientes_controller.rb:88:in `index' 我在这里缺少什么?
  • 另外,我确实希望能够在我的应用程序中显示客户的常规索引以及在需要时显示搜索结果。更改旧的索引视图不会弄乱我旧的默认客户端索引吗?
  • 如果我尝试其他方法并调用我的 def src 而不是 find,请在视图/布局文件中使用 并仍然使用您建议的代码,我得到一个不同的 nil 对象 NoMethodError: C:/Rails/clientes/app/controllers/clientes_controller.rb:88:in `src' 请求参数: {"search_string"=>"eduardo calvachi", "commit"=>"Search" , "authenticity_token"=>"mSaFeUAWdIWBNPkTufX2hdx7NaMaGfLSp1h78nTB7Ns="}
  • 我认为大多数人在索引上标记搜索,因为它通常做的事情与索引完全相同,但使用给定的参数而不是列出所有
  • 检查你的开发日志,看看哪个对象是nil,如果你不知道,只需在你的问题中发布最后 20 行左右。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2012-11-20
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多