Ruby / Rails Условный метод поиска (если ... иначе "ничего не найдено") - PullRequest
0 голосов
/ 13 сентября 2010

Вот код «простой формы поиска» (спасибо 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

, сообщив об ошибке: «У вас естьнулевой объект, когда вы этого не ожидали! ... "(нет экземпляра в массиве).Затем я попытался добавить

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

в представлении.Но это тоже не работает.

Мне было бы приятно понять, почему я ошибаюсь в этом.Спасибо!

Ответы [ 4 ]

3 голосов
/ 13 сентября 2010

Вы на правильном пути. Попробуйте это:

<% 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 голосов
/ 13 сентября 2010

вы не можете визуализировать в вашей модели.

На ваш взгляд:

<% 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
1 голос
/ 13 сентября 2010

Ваш метод self.search должен возвращать массив, либо полный, либо пустой.Попробуйте:

в вашей модели

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

и на ваш взгляд

  <% if @users? %>
    <% @users.each do |user| %>
      …
    <% end %>
  <% else %>
    No result
  <% end %>
1 голос
/ 13 сентября 2010

Вы закрыли свой чек на @users?, но оно должно быть:

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

Это будет работать с вашей исходной реализацией self.search, которая, правильно, используется только для поиска пользователей, и не нужно беспокоиться о создании отчетов, если ничего не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...