新手问题 Rails 简单搜索求教

danielfeng · 2016年01月04日 · 最后由 danielfeng 回复于 2016年01月05日 · 2902 次阅读

需求:想实现通过 view 传递搜索关键字到 controller,进行变量 select,最终改变变量反馈到 view。各位大神有啥好方法。

  • 在 view 中加入以下代码 ruby <%= form_tag("/search", method: :get) do %> <%= text_field_tag :search, params[:search], class: 'form-control search', placeholder: "search..." %> <% end %>
  • 在 controller 中下了如下代码 ruby def search @cm = @cma.select { |k,j| k =~/#{params[:search]}/ } render "index" end def index @cma = list.select {|k,j| k =~/cm/ } ....... end
  • 但执行搜索时候报错 undefined method `each' for nil:NilClass

search 方法的第一行改成 @cm = list.select { |k,j| k =~/#{params[:search]}/ } 试试

#1 楼 @ywjno 依旧是 undefined method `each' for nil:NilClass

Started GET "/search?utf8=%E2%9C%93&search=s" for 192.168.8.166 at 2016-01-04 14:09:40 +0000
Processing by HomesController#search as HTML
  Parameters: {"utf8"=>"✓", "search"=>"s"}
  Rendered homes/index.html.erb within layouts/application (269.6ms)
Completed 500 Internal Server Error in 312ms

ActionView::Template::Error (undefined method `each' for nil:NilClass):

#1 楼 @ywjno 没有 search 方法时候 each 是好的

感觉你这个没啥好说的吧,一个 view 页面用到 each 的地方应该不会多,然后排查一下哪个是 nil 应该不会太难。

#4 楼 @qinfanpeng 我有点小白,有个疑问同样的 controller 在 index 传递到 view 中是正常,但在方法 search 中却 nil……

search action 中 @cma 在哪赋的值?controller 的代码全贴出来

#5 楼 @danielfeng searchindex 变量一个是 @cma,一个是 @cm

首先我很好奇这个 search 的 form 写在了哪个 view 里面,在你访问

search?utf8=%E2%9C%93&search=s

的时候@cma和 list 是否已经赋值了。单凭眼睛看而缺少上下文的环境下,我也很难指出哪里出了问题,建议加个 binding.pry 调试一下。

#6 楼 @nowherekai #7 楼 @qinfanpeng

  • routes 中代码如下 ruby match '/search', to: 'homes#search', via: :get
  • Controller 代码如下 ```ruby require 'docker' class HomesController < ApplicationController def search url = Docker::Container.all({}, Docker::Connection.new('tcp://192.168.1.10:2375', {})) list = url.collect { |url| [url.info["Image"], url.info["Ports"][0]["PublicPort"]]} @dsa = list.select {|k,j| k =~/ds/ } @ds = @dsa.select { |k,j| k =~/#{params[:search]}/ } render "index" end

def index url = Docker::Container.all({}, Docker::Connection.new('tcp://192.168.1.10:2375', {})) list = url.collect { |url| [url.info["Image"], url.info["Ports"][0]["PublicPort"]]} @dsa = list.select {|k,j| k =~/ds/ } @ds = @dsa.each {|k| k[1]=k[1]/100} end end

- view代码如下
```ruby
<%= form_tag("/search", method: :get) do %>
    <%= text_field_tag :search, params[:search], class: 'form-control search', placeholder: "search..." %>
<% end %>

<% @ds.each do |p, k| %>
  • 现象:在 index 是正常,但 search 时候就出现如下报错 ```ruby Started GET "/search?utf8=%E2%9C%93&search=d" for 192.168.209.10 at 2016-01-05 02:19:20 +0000 Processing by HomesController#search as HTML Parameters: {"utf8"=>"✓", "search"=>"d"} Rendered homes/index.html.erb within layouts/application (266.8ms) Completed 500 Internal Server Error in 295ms

ActionView::Template::Error (undefined method `each' for nil:NilClass): 62: <% end %> 63: 64: 65: <% @ds.each do |p, k| %>

#8 楼 @colinlll 我就直接写在 app/views/homes/index.html.erb 整个页面就一个 html

看下 search 里的 @ds 返回啥?

@ds = @dsa.select { |k,j| k =~/#{params[:search]}/ } 

这里加个空值保护啊,万一你的检索条件是一个值也没有检索出来的,@ds就是 nil 不能用 each 方法了。

#12 楼 @adamshen 感觉这里不会为 nil 喃,即使一个都没 select 到,返回的是空数组才对。

#13 楼 @qinfanpeng 你说的对,确实如此,可能是其他地方的 each 报错吧。

#13 楼 @qinfanpeng #14 楼 @adamshen #6 楼 @nowherekai #1 楼 @ywjno 貌似可以了。。。我先回想,等下写总结,太感谢各位了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号