Я пытаюсь создать фильтр, который по сути сидит поверх индекса. Идея состоит в том, что пользователь может проверить определенный набор атрибутов (оставив других непроверенными для атрибутов, которые им не нужны). После отправки результат должен возвращаться со всеми элементами, которые удовлетворяют этим атрибутам (при игнорировании непроверенных атрибутов).Результаты фильтрации - 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"}
Любая идея, почему это не было просто вернуться ко мне только специалистов, которые служат Бруклин и Манхэттен?
Спасибо!
Спасибо, так что я искал, чтобы делать это с областями, а также. Я застрял в том, как передать информацию из form_tag в контроллер, чтобы вызвать область действия.Как должен выглядеть контроллер? Например, у меня есть область: manhattan_served, -> {где (manhattan_served: true)} scope: brooklyn_served, -> {где (brooklyn_served: true)} как области в моей модели сейчас. Если пользователь просто проверяет окно Манхэттена, что должен выглядеть контроллер, чтобы он вызывал только область Манхэттена, но не Бруклинскую? –
Если изменить эти определения области действия, чтобы что-то вроде: 'рамки: manhattan_served, -> (manhattan_served) {где ("manhattan_served НРАВИТСЯ?", Manhattan_served || = '%')' Вы можете приковать их вместе ваш контроллер: 'Expert.manhattan_served (params [: manhattan_served]). brooklyn_served (params [: brooklyn_served])' Эффект «LIKE%» относится к подстановочному знаку, если вы не указали значение. Поэтому, если один из этих параметров оценивается как «нуль» (потому что вы его не предоставили), он просто подстановит это поле и выполнит поиск на другом. Если вы укажете оба параметра, он вернет явные соответствия для обоих. – 10dot
Спасибо. Я закончил с драгоценным камнем has_scope. Я хотел создать его с нуля, чтобы действительно понять его, но для чего я в конечном итоге хочу это сделать, я думаю, что создание с нуля может быть слишком сложным. Спасибо за вашу помощь –