在看railscast中的Simple Search Form,参考该教程的代码:
projects/index.html.erb
<% form_tag projects_path, :method => 'get' do %>
<p>
<%= text_field_tag :search%>
<%= submit_tag "Search" %>
</p>
<% 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