2016-03-24 2 views
0

Я пытаюсь создать фильтр, который по сути сидит поверх индекса. Идея состоит в том, что пользователь может проверить определенный набор атрибутов (оставив других непроверенными для атрибутов, которые им не нужны). После отправки результат должен возвращаться со всеми элементами, которые удовлетворяют этим атрибутам (при игнорировании непроверенных атрибутов).Результаты фильтрации - Ruby on Rails

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

Вот пример того, что у меня до сих пор. : manhattan_served и: brooklyn_served - всего лишь два примера атрибутов. Я надеюсь иметь что-то вроде 20, где пользователь может проверить, может быть, 5 или 6 из этих атрибутов за раз.

/app/views/experts/filtered_experts.html.erb

<%= form_tag filtered_experts_path, method: :get do %> 
    <%= label_tag(:manhattan_served, "Serves Manhattan") %> 
    <%= check_box_tag :manhattan_served, true%> 

    <%= label_tag(:brooklyn_served, "Serves Brooklyn") %> 
    <%= check_box_tag :brooklyn_served, true%> 

<%= submit_tag "Filter", name: nil %> 
<% end %> 

Вот что у меня в контроллере

/app/controllers/experts_controller.rb

def filtered_experts 
     @experts = Expert.where(params[filtering_params]) 
    end 

private 

    def filtering_params 
     params.slice(:manhattan_served, :brooklyn_served) 
    end 

Right теперь, когда я отправляю, я просто возвращаю полный список каждый раз. Глядя на мой журнал сервера рельсы, похоже, это получение передается к контроллеру:

Processing by ExpertsController#filtered_experts as HTML 
    Parameters: {"utf8"=>"✓", "manhattan_served"=>"true", "brooklyn_served"=>"true"} 

Любая идея, почему это не было просто вернуться ко мне только специалистов, которые служат Бруклин и Манхэттен?

Спасибо!

ответ

0

Я не совсем уверен, что вы пытаетесь достичь с помощью фильтрации, поэтому я не уверен, что предложить в качестве альтернативы ...

Я могу вам сказать, однако, что причина, вы «вновь видим, что вернуть все результаты из-за:

params[filtering_params] 

Hash.slice в рельсах возвращает копию хэша только с заданными ключами, так что ваши filtering_params() вызов возвращает {: manhattan_served => верно, : brooklyn_served => true}. Вы затем использовать это в качестве хэш-ключа, когда вы делаете:

@experts = Expert.where(params[filtering_params]) 

Поскольку хэш поиска явно не удается, он возвращает ноль. Если вы звоните .гд() с нулем, это как делает:

SELECT * from experts WHERE 1=1; 

Вы можете исправить это один случай, просто изменив этот призыв:

@experts = Expert.where(filtering_params) 

Но я подозреваю, что вы будете работать в другие проблемы позже, в зависимости от того, сколько параметров вы фильтруете/etc. Я бы рекомендовал посмотреть в названные области. Вы можете связать их вместе, чтобы построить отношения AR, и часто люди решают некоторые из этих проблем.

http://guides.rubyonrails.org/active_record_querying.html#scopes

+0

Спасибо, так что я искал, чтобы делать это с областями, а также. Я застрял в том, как передать информацию из form_tag в контроллер, чтобы вызвать область действия.Как должен выглядеть контроллер? Например, у меня есть область: manhattan_served, -> {где (manhattan_served: true)} scope: brooklyn_served, -> {где (brooklyn_served: true)} как области в моей модели сейчас. Если пользователь просто проверяет окно Манхэттена, что должен выглядеть контроллер, чтобы он вызывал только область Манхэттена, но не Бруклинскую? –

+0

Если изменить эти определения области действия, чтобы что-то вроде: 'рамки: manhattan_served, -> (manhattan_served) {где ("manhattan_served НРАВИТСЯ?", Manhattan_served || = '%')' Вы можете приковать их вместе ваш контроллер: 'Expert.manhattan_served (params [: manhattan_served]). brooklyn_served (params [: brooklyn_served])' Эффект «LIKE%» относится к подстановочному знаку, если вы не указали значение. Поэтому, если один из этих параметров оценивается как «нуль» (потому что вы его не предоставили), он просто подстановит это поле и выполнит поиск на другом. Если вы укажете оба параметра, он вернет явные соответствия для обоих. – 10dot

+0

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