Ruby / Rails条件搜索方法(如果......其他“找不到结果”)

时间:2010-09-13 16:13:09

标签: ruby-on-rails ruby search

以下是我尝试改进的“简单搜索表单”(感谢jordinl)的代码。如果找不到匹配项,我想添加案例。

所以,有视图(views / users / 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

报告以下错误:“当你没想到它时,你有一个nil对象!...”(数组中没有实例)。然后,我尝试添加

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

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

您与@users?的支票很接近,但应该是:

<% if !@users.empty? %>
  <% @users.each do |user| %>
    ...
  <% end %>
<% else %>
  No users found.
<% end %>

这适用于原始self.search实施,正确地,它仅用于查找用户,如果没有找到,则无需担心报告。

答案 3 :(得分:1)

你的self.search方法应该返回一个完整或空的数组。尝试:

在你的模特中

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

并在您的视图中

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