在看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
上面的教程可以按照預(yù)期執(zhí)行,但是改寫project.rb中代碼
def self.search(search)
if search
#這句是改寫的代碼哭懈,這句話總是返回name like demo的語句茎用。
where('name LIKE ?', "demo")
else
all
end
end
于是在index.html.erb中進(jìn)行數(shù)據(jù)輸入:
1、當(dāng)輸入一個(gè)特定的值的時(shí)候轨功,比如“xx”,前端界面返回select x from projects where name like "demo"的值垂券,后臺(tái)也能看到這個(gè)數(shù)據(jù)羡滑;
2、當(dāng)輸入空值的時(shí)候柒昏,前端界面還是返回如上的結(jié)果,我的理解當(dāng)輸入空值時(shí)候职祷,應(yīng)該返回select x from projects;
如上提到的第二點(diǎn)是我想要問的問題是尖,當(dāng)search這個(gè)值是空值的時(shí)候我的預(yù)期是返回全部結(jié)果泥耀,而實(shí)際上返回了select * from projects where name like "demo"這個(gè)結(jié)果,這是為何爆袍?
解決方式如下:
def index
@projects = Project.search(params[:search])
@type = params[:search].class
@result = params[:search].nil?
end
經(jīng)過演示知道如下結(jié)果:
@type #=>String
@result #=> false
查看了api,并且在irb中經(jīng)過演示如下:
"".class #=>String
"".nil? #=> false
經(jīng)過總結(jié)得出弦疮,Simple Search Form中的else后面的代碼是不會(huì)被執(zhí)行的蜘醋,因?yàn)閟earch的值永遠(yuǎn)返回的是true,如下代碼所示:
def self.search(search)
if search
where ('name LIKE ?', "#{search}%")
else
all
end
end
因此對上面的代碼進(jìn)行改進(jìn),改進(jìn)后的代碼如下:
def self.search(search)
where("name like ?", "#{search}%")
end