Rails 4 - 对父显示页面上的嵌套资源进行 Ransack 使用
Rails 4 - Ransack usage with nested resources on parent show page
所以在我的应用程序中,一个客户端有很多站点,我的路由和控制器嵌套在客户端下,它们都出现在显示页面上(下面的代码)。
我想要实现的是在客户端显示页面上实现 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') %>
我想做的是只搜索与正在显示的客户端关联的站点。这里的任何帮助将不胜感激。
我不熟悉搜查,但我猜你应该使用关联来确定搜索范围,例如:
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
由于 Taryn East 上面的回答让我开始行动,因此解决方案分为两部分!
控制器动作剂量需要像她建议的那样限定范围:
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 %>
这解决了问题
所以在我的应用程序中,一个客户端有很多站点,我的路由和控制器嵌套在客户端下,它们都出现在显示页面上(下面的代码)。
我想要实现的是在客户端显示页面上实现 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') %>
我想做的是只搜索与正在显示的客户端关联的站点。这里的任何帮助将不胜感激。
我不熟悉搜查,但我猜你应该使用关联来确定搜索范围,例如:
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
由于 Taryn East 上面的回答让我开始行动,因此解决方案分为两部分!
控制器动作剂量需要像她建议的那样限定范围:
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 %>
这解决了问题