Как запросить значение вводится в форму поиска - PullRequest
0 голосов
/ 30 августа 2009

Я построил базовую форму поиска, которая запрашивает один столбец в одной таблице моего приложения. Я следил за эпизодом 37 Railscast: http://railscasts.com/episodes/37-simple-search-form. Примечание. Я только что опубликовал еще один вопрос, связанный с поиском, но это совершенно другой вопрос.

В моем приложении поиск запрашивает столбец почтового индекса в моей таблице профилей и возвращает список профилей, которые содержат правильный почтовый индекс.

Вот моя проблема. В настоящее время, когда пользователь оставляет поле ввода пустым и нажимает кнопку отправки, при поиске отображаются все профили на сайте. Я не хочу, чтобы это случилось. Если поле пустое, я не хочу, чтобы поиск проходил. Я хотел бы либо сделать флэш-уведомление, либо выдать ошибку, объясняющую, что пользователю необходимо ввести почтовый индекс, чтобы продолжить.

Вот мои настройки:

КОНТРОЛЛЕР ПРОФИЛЕЙ

def index  
    @profiles = Profile.search(params[:search])  
end

ПРОФИЛЬНАЯ МОДЕЛЬ

def self.search(search)
        if search
                find(:all, :conditions => ['zip LIKE ?', "%#{search}%"])
        else
                find(:all)
        end
end

PROFILE / index.html.erb

<% form_tag ('/profiles', :method => :get) do %>
    <%= text_field_tag :search, params[:search], :maxlength => 5 %>
    <%= submit_tag "Go", :name => nil %>                
<% end %>

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 августа 2009
def index
  @profiles = Profile.search(params[:search]) unless params[:search].blank?
end

Вы, вероятно, не хотите выдавать ошибку, если поле поиска пустое, потому что пользователь увидит эту ошибку при первом посещении страницы индекса. Чтобы правильно обработать этот тип сообщения об ошибке, вам нужно выполнить одно из нескольких действий.

  • Разделите генерацию формы и фактический поиск на два отдельных действия. В приложении RESTful это обычно действие new и create. (новый для формы, создать для фактического поиска).
  • Добавьте проверку для сообщения, в отличие от получения. Попробуйте только поиск или сгенерируйте ошибку, если это пост. В противном случае просто покажите форму. Обычно вы увидите это в более старых примерах на Rails (например, в руководствах до 2.0).
  • Добавьте скрытое поле с надписью «Привет, я отправляю запрос». Это та же идея, что и при проверке сообщения, но она все равно будет работать, если вы по каким-либо причинам захотите получить все.

Мой выбор будет первым. Это примерно выглядело бы так.

def new
end

def create
  if params[:search].blank?
    flash.now[:error] = "Please enter a zip code to search for."
    render :new
  else
    @profiles = Profile.search(params[:search])
    render :show
  end
end

По вашему мнению, new.html.erb (или .haml или что-то еще) будет содержать вашу форму поиска, а show.html.erb будет содержать результаты вашего поиска. Обычно есть частичная поисковая форма, которой они оба поделятся.

0 голосов
/ 30 августа 2009

Я действительно нашел ответ на этот вопрос, который не требует от меня внесения каких-либо изменений в мои текущие настройки.

Если вы посмотрите в поисковой модели выше, которую я скопировал из Railscast, вы увидите, что Райан включал подстановочные знаки с обеих сторон поискового запроса:

find(:all, :conditions => ['zip LIKE ?', "%#{search}%"])

Я совсем не знаком с синтаксисом sql, поэтому я пропустил это. Это были те шаблоны, которые пропускали пустой поиск и возвращали все результаты в базе данных. Когда я удалил «%» из этого оператора SQL, пустой поиск теперь возвращает тот же результат, что и поиск, в котором у нас нет записи, совпадающей с запрошенным почтовым индексом, а именно тот результат, который я хотел.

Просто хотел поделиться, чтобы другие могли поймать это в будущем.

0 голосов
/ 30 августа 2009

Вам просто нужно проверить, если оно пустое, прежде чем приступить к поиску.

def index
  if params[:search].blank?
    flash[:error] = "Doh! You forgot the zip code."
  else
    @profiles = Profile.search(params[:search])
  end
end

Если возвращение всех результатов никогда не является прецедентом, вы можете также удалить этот код из вашей модели. Кроме того, если вы проверяете пустой поиск более чем в одном действии контроллера, вам следует переместить логику в модель.

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