2013-12-13 4 views
0

Для моей форме поиска, я использую решение здесь: https://stackoverflow.com/a/12622896/1943735Как сохранить параметры в моей форме?

Моя страница Поиск выглядит следующим образом:

= simple_form_for search_query, :url => :search, do |f| 
    = f.input :first_name 
    = f.input :last_name 
    ... 

Table To Display Results is here 

В мой контроллер, у меня есть это:

def search 
    search_params = params[:search_query] 
    @people = Result of some searching 
end 

выше код работает, за исключением того, что пользователь не может видеть, какие значения они только что ввели в форму и получить только результаты. Форма снова отображается и теперь пуста.

Моя попытка решения является:

def search 
    search_params = params[:search_query] 
    @people = Result of some searching 
    @search_query = params[:search_query] 
end 

Однако теперь форма бросает NoMethodError с undefined method 'first_name' for #<ActionController::Parameters:0x007fa5688aa268> на линии = f.input :first_name Как я могу передать свою SEARCH_QUERY обратно в форме?

ответ

1

Я думаю, что трюк здесь заключается в использовании GET вместо POST, таким образом, эти параметры поиска будут оставаться видимыми в вашем представлении.

Вот пример прямо из рабочего приложения я написал ...

def index 
    authorize! :index, Employee 

    params[:filter] ||= 'All' # Default to All Employees 
    params[:search] ||= '' # Default to blank 
    page_title ||= params[:filter].titleize 

    # Clear the search field if a filter option was selected 
    if session[:employee_filter] != params[:filter] 
     session[:employee_filter] = params[:filter] 
     params[:search] = '' 
    end 

    # Generate an array of our filter elements (include all departments) 
    @page_links = %w[All Featured Admins] 
    Department.all.each do |department| 
     @page_links << [department.title, department.name] 
    end 

    # Check and execute the filter option (defaults to All above) 
    case params[:filter] 
     when 'All' 
     @employees = Employee.search(params[:search]).by_name.page(params[:page]).per(15) 
     when 'Featured' 
     # We need this to be all on one page so that we can drag-and-drop position employees 
     @employees = Employee.search(params[:search]).is_featured.page(params[:page]).per(99999) 
     when 'Admins' 
     @employees = Employee.search(params[:search]).admins.by_name.page(params[:page]).per(15) 
     @page_title = 'Site Administrators' 
     else 
     @employees = Employee.search(params[:search]).dept(params[:filter]).by_index.page(params[:page]).per(15) 
    end 

    @page_title ||= "#{page_title} Employees" 
    @page_title = "'#{params[:search]}' in #{page_title}" unless params[:search].blank? 

    end 

А вот метод поиска в модели Employee:

def self.search(search) 
    if search 
     results = where('last_name ILIKE ? OR first_name ILIKE ? OR email ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%") 
     results = where('title ILIKE ?', "%#{search}%") if results.blank? 
     results = joins(:location).where('locations.name ILIKE ?', "%#{search}%") if results.blank? 
     return results 
    end 
    end 

И, наконец, форму поиска из индекс (в формате HAML):

.sort-index 
    = form_tag admin_employees_path, method: 'get' do 
    = select_tag :filter, options_for_select(@page_links, params[:filter]), onchange: "this.form.submit();" 
    %br 
    = text_field_tag :search, params[:search], placeholder: 'Search Name, Title, or Location', size: 35 
    = submit_tag :search, name: nil, hidden: true 

В нем есть дополнительные материалы для поиска (например, дополнение l фильтров), поэтому дайте мне знать об этом, что слишком усложняет для вас.

Смежные вопросы