Rails 4 — Использование Ransack с вложенными ресурсами на родительской странице показа

#ruby-on-rails #ruby-on-rails-4 #ransack

#ruby-on-rails #ruby-on-rails-4 #ransack

Вопрос:

Итак, в моем приложении у клиента много сайтов, мои маршруты и контроллер вложены в клиенты, и все они отображаются на странице показа (код ниже).

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

В настоящее время, когда я создаю сайт, связанный с клиентом, он отображает ВСЕ сайты для всех клиентов, независимо от того, с каким клиентом связан сайт.

мои маршруты:

   resources :clients, controller: 'clients' do
    resources :sites, controller: 'clients/sites', except: [:index]
  end
  

клиентский контроллер / показать действие

  class ClientsController < ApplicationController 
      def show
        @client = Client.find(params[:id])

        @q = Site.ransack(params[:q])
        @sites = @q.result(distinct: true).page(params[:page]).per(5)
      end
end
  

Мои модели:

 class Client < ApplicationRecord
 has_many :sites, dependent: :destroy
end 

class Site < ApplicationRecord
 belongs_to :client
end
  

Моя форма поиска и сортировки ссылок на странице Clients / show [: id]

 <%= search_form_for @q do |f| %>
 <%= f.search_field :site_ident_or_site_name_cont, :class => 'form-control', :placeholder => 'search client...' %>
<% end %>

<%= sort_link(@q, :site_name, 'Site Name') %>
  

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

Ответ №1:

Я не знаком с ransack, но я бы предположил, что вам следует использовать ассоциацию для определения области поиска, например:

   def show
    @client = Client.find(params[:id])

    # scope by just the sites belonging to this client
    @q = @client.sites.ransack(params[:q])
    @sites = @q.result(distinct: true).page(params[:page]).per(5)
  end
  

Комментарии:

1. Итак, с этим я получаю {NoMethodError в /clients/1 неопределенный метод `sites_path’ для #<#<Class:0x007f863be58a58>:0x007f863ca6adc8> Ты имел в виду? asset_path}

2. Хорошо, я понял это! Ваш пост заставил меня задуматься, что в форму поиска также необходимо внести некоторые изменения. Спасибо за вашу помощь!

Ответ №2:

Таким образом, решение состояло из 2 частей, благодаря ответу Тарин Ист выше за то, что он заставил меня начать!

доза действия контроллера должна быть ограничена, как она предложила, вот так:

   def show
    @client = Client.find(params[:id])

    # scope by just the sites belonging to this client
    @q = @client.sites.ransack(params[:q])
    @sites = @q.result(distinct: true).page(params[:page]).per(5)
  end
  

затем несколько изменений в форме поиска:

 <%= search_form_for @q, url: client_path(params[:id]) do |f| %>
 <%= f.search_field :site_name_cont, :class => 'form-control', :placeholder => 'search client...' %>
<% end %>
  

Это устранило проблему