Rails 4 - 在父显示页面

时间:2016-10-04 02:48:55

标签: ruby-on-rails ruby-on-rails-4 ransack

所以在我的应用程序中,客户端有很多站点,我的路由和控制器嵌套在客户端下,它们都出现在显示页面上(下面的代码)。

我想要实现的目的是在客户端显示页面上显示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

我的搜索表单和客户/ 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') %>

我想要做的只是搜索与正在显示的客户端关联的网站。这里的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我对hansack不熟悉,但我猜你应该使用这种关联来搜索范围,例如:

  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 :(得分:1)

所以解决方案是一个2部分的解决方案,这要归功于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 %>

这解决了问题