#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 %>
Это устранило проблему