新手问题 Rails 简单搜索求教

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

需求:想实现通过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
共收到 15 条回复

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 貌似可以了。。。我先回想,等下写总结,太感谢各位了。

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