【问题标题】:Ruby/Rails Conditional search method (if ... else "no results found")Ruby/Rails 条件搜索方法(如果...否则“未找到结果”)
【发布时间】:2010-09-13 16:13:09
【问题描述】:

这是我尝试改进的“简单搜索表单”的代码(感谢 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| %>
.
.
.

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

我很高兴能理解我为什么错了。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby search


    【解决方案1】:

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

    <% 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
    

    【讨论】:

    • 感谢您的帮助!问候
    • 这是一种很常见的模式,如果你喜欢这些东西,你总是可以为它做一个助手。
    【解决方案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
    

    【讨论】:

    • 谢谢,但是有个小问题,如果用户不使用搜索,视图会呈现“No records found!”。为此,我尝试使用 if search.to_s.size 0 并尝试在模型中实现它。我可以在视图中使用参数(搜索)吗?谢谢你
    • unlesselse 一起使用是糟糕的场景。为什么不直接翻转它们并使用if?双重否定令人困惑。第二个条件是“除非用户数组为空”。
    【解决方案3】:

    您对@users? 的检查很接近,但应该是:

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

    这将适用于您最初的 self.search 实现,正确地,它仅用于查找用户,如果没有找到,则无需担心报告。

    【讨论】:

    • 感谢您的回答,这与第一个非常相似。但是,我仍然向 Sled 提出了一个小问题。我很乐意听取您的观点。谢谢!
    【解决方案4】:

    你的 self.search 方法应该返回一个数组,要么是满的,要么是空的。试试:

    在你的模型中

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

    在你看来

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

    【讨论】:

    • 确实!如果 !@users.empty 应该是 :-(
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2013-12-23
    • 2023-03-14
    • 1970-01-01
    • 2020-02-05
    • 2016-04-07
    • 2015-04-20
    • 2016-01-11
    相关资源
    最近更新 更多