判断语句中string的陷阱

在看railscast中的Simple Search Form,参考该教程的代码:

projects/index.html.erb

<% form_tag projects_path, :method => 'get' do %>
  

<%= text_field_tag :search%> <%= submit_tag "Search" %>

<% end %>

projects_controller.rb

def index
  @projects = Project.search(params[:search])
end

models/project.rb

def self.search(search)
  if search
    where ('name LIKE ?', "#{search}%")
  else
    all
  end
end

上面的教程可以按照预期执行,但是改写project.rb中代码

def self.search(search)
  if search
    #这句是改写的代码,这句话总是返回name like demo的语句。
    where('name LIKE ?', "demo")
  else
    all
  end
end

于是在index.html.erb中进行数据输入:
1、当输入一个特定的值的时候,比如“xx”,前端界面返回select x from projects where name like "demo"的值,后台也能看到这个数据;
2、当输入空值的时候,前端界面还是返回如上的结果,我的理解当输入空值时候,应该返回select x from projects;

如上提到的第二点是我想要问的问题,当search这个值是空值的时候我的预期是返回全部结果,而实际上返回了select * from projects where name like "demo"这个结果,这是为何?

解决方式如下:

def index
  @projects = Project.search(params[:search])
  @type = params[:search].class
  @result = params[:search].nil?
end

经过演示知道如下结果:

@type #=>String
@result #=> false

查看了api,并且在irb中经过演示如下:

"".class  #=>String
"".nil? #=> false

经过总结得出,Simple Search Form中的else后面的代码是不会被执行的,因为search的值永远返回的是true,如下代码所示:

def self.search(search)
  if search
    where ('name LIKE ?', "#{search}%")
  else
    all
  end
end

因此对上面的代码进行改进,改进后的代码如下:

def self.search(search)
  where("name like ?", "#{search}%")
end

你可能感兴趣的:(判断语句中string的陷阱)