2010-09-13 50 views
0

下面是我尝试改进的“简单搜索表单”(感谢jordinl)的代码。如果找不到匹配项,我想补充说明。Ruby/Rails条件搜索方法(if ... else“找不到结果”)

所以,有观点(视图/用户/ index.html.erb)

<% form_tag users_path, :method => 'get' do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", :name => nil %> 
<% end %> 

<% @users.each do |user| %> 
    <p><%= link_to "#{user.name}", user %></p> 
. 
. 
. 
<% end %> 

控制器(users_controller.rb)

def index 
    @users = User.search(params[:search]) 
end 

和在用户模型的方法:

def self.search(search) 
    search.blank? ? [] : all(:conditions => ['name LIKE ?', "%#{search.strip}%"]) 
end 

我试过如下:

def self.search(search) 
    if search.to_s.size < 1 
    [] 
    else 
    if @users.size > 0 
     all(:conditions => ['name LIKE ?', "%#{search.strip}%"]) 
    else 
     render :text => "No result found" 
    end 
    end 
end 

报告出现以下错误:“您没有预期它的零对象!”(数组中没有实例)。然后,我试图添加

<% if @users? %> 
    <% @users.each do |user| %> 
. 
. 
. 

在视图中。但它也不起作用。

我会很高兴地明白为什么我错了。谢谢!

回答

3

你在正确的轨道上。试试这个:

<% if (@users) %> 
    <% if (@users.empty?) %> 
    <p>No users found.</p> 
    <% else %> 
    <% @users.each do |user| %> 
     <p><%= link_to "#{user.name}", user %></p> 
    <% end %> 
    <% end %> 
<% else %> 
    <p>Use the search form to search for stuff.</p> 
<% end %> 

更改您的搜索方法只返回东西,如果使用搜索:

def self.search(search) 
    search.present? and all(:conditions => [ 'name LIKE ?', "%#{search.strip}%" ]) 
end 
+0

感谢您的热心帮助!Regards – benoitr 2010-09-13 17:02:05

+0

这是一种常见的模式,如果您是这种事情的粉丝,您可以随时帮助它。 – tadman 2010-09-13 19:56:35

2

你不能在你的模型中渲染。

在你看来:

<% form_tag users_path, :method => 'get' do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", :name => nil %> 
<% end %> 

<% if @users.empty? %> 
    No records found! 
<% else %> 
    <% @users.each do |user| %> 
    <p><%= link_to "#{user.name}", user %></p> 
    <% end %> 
<% end %> 

在你的模型:

def self.search(search) 
    search.blank? ? [] : all(:conditions => ['name LIKE ?', "%#{search.strip}%"]) 
end 
+0

谢谢你,但有一个小问题,如果用户不使用搜索时,查看渲染“找不到记录!”。这是因为我试图使用如果search.to_s.size <1和如果@ users.size> 0并试图在模型中实现它。我可以在视图中使用参数(搜索)吗? 谢谢 – benoitr 2010-09-13 16:43:00

+0

使用''除非'else'是不好的场景。为什么不把它们翻转并使用'if'?双重否定是令人困惑的。第二个条件是“除非用户数组是空的”。 – tadman 2010-09-13 16:43:23

1

您是密切与@users?您的支票,但它应该是:

<% if [email protected]? %> 
    <% @users.each do |user| %> 
    ... 
    <% end %> 
<% else %> 
    No users found. 
<% end %> 

这将工作您的原始self.search实施,正确地,仅用于查找用户如果没有发现,则不需要担心报告。

+0

感谢您的回答,这与第一个非常相似。但是,我对斯莱德的问题仍然存在一些小问题。我很乐意有你的观点。谢谢! – benoitr 2010-09-13 16:44:35

1

你的self.search方法应该返回一个数组,可以是full或empty。尝试:

在你的模型

def self.search 
    self.all(:conditions => ['name LIKE ?', "%#{search.strip}%"]) 
end 

,并在您的视图

<% if @users? %> 
    <% @users.each do |user| %> 
     … 
    <% end %> 
    <% else %> 
    No result 
    <% end %> 
+0

我不认为'@users?'会按照你的意图工作。 – tadman 2010-09-13 16:44:31

+0

确实!它应该是<%if!users.empty? %> :-( – Yannis 2010-09-13 20:58:10