2013-06-07 1 views
1

jquery-datatables-rails을 사용하여 색인에 대한 정보를 표시하고 this 뒤에 필터를 추가했습니다. 그러나 데이터 테이블은 필터를 무시하는 것으로 보이며 get 요청에 요청 된 json의 일부로 표시되지 않습니다.jquery-datatables-rails에서 필터가 무시됩니다.

색인 방법, datatables 클래스, 색인보기 및 실행중인 coffeescript를 묶었습니다.

색인 방법

def index 
    @sbcons = Subcontractor.scoped 
    if filters = params[:filter] 
     @sbcons = @sbcons.where(sbcon_type: filters[:type]) unless filters[:type].blank? 
     @sbcons = @sbcons.where(cscs_card: filters[:cscs]) unless filters[:cscs].blank? 
     @sbcons = @sbcons.where(approved_status: filters[:approved]) unless filters[:approved].blank? 
    end 
    respond_to do |format| 
     format.html 
     format.json do 
     render json: SubcontractorsDatatable.new(view_context, @sbcons) 
     end 
    end 
    end 

인덱스보기

<% provide(:title, 'All Subcontractors') %> 
<h1>Subcontractors List</h1> 
<div class="filter"> 
    <%= form_tag(method: :get, id: "filter_form") do %> 
    <%= label_tag :sbcon_type, "Type" %> 
    <%= select_tag "filter[type]", options_for_select([[],["Labour Only"], ["Specialist"], ["Both"]]) %> 
    <%= label_tag :cscs_card, "CSCS" %> 
    <%= select_tag "filter[cscs]", options_for_select([[],["Yes"], ["No"]]) %> 
    <%= label_tag :approved_status, "Approved Status" %> 
    <%= select_tag "filter[approved]", options_for_select([[],["Approved"], ["Not Approved"]]) %> <br> 
    <%= link_to "Filter", '#', id: "filterbutton", class: "btn btn-mini" %> 
    <% end %> 
    <br> 
</div> 
<table id="subcontractors" class="table table-condensed table-hover display" data-source="<%= subcontractors_url(format: "json") %>"> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Contact Number</th> 
     <th>CSCS</th> 
     <th>Type</th> 
     <th>Scotland</th> 
     <th>NE England</th> 
     <th>NW England</th> 
     <th>Midlands</th> 
     <th>SE England</th> 
     <th>SW England</th> 
     <th>London</th> 
     <th>Wales</th> 
     <th>Operatives</th> 
     <th>Product Liability</th> 
     <th>Employer Liability</th> 
     <th>Public Liability</th> 
     <th>Contractors All Risk</th> 
     <th>Status</th> 
    </tr> 
    </thead> 
    <tbody> 
    </tbody> 
</table> 

<%= javascript_tag do %> 
    $('#filterbutton').click(function(){ 
    $('#subcontractors').dataTable().fnDraw(); 
    }); 
<% end %> 

Datatables 클래스

class SubcontractorsDatatable 
    delegate :params, :h, :link_to, to: :@view 

    def initialize(view, sbcons) 
    @view = view 
    @sbcons = sbcons 
    end 

    def as_json(option = {}) 
    { 
     sEcho: params[:sEcho].to_i, 
     iTotalRecords: Subcontractor.count, 
     iTotalDisplayRecords: subcontractors.total_entries, 
     aaData: data 
    } 
    end 

private 
    def data 
    subcontractors.map do |subcontractor| 
     [ 
     link_to(subcontractor.sbcon_name, subcontractor), 
     h(subcontractor.con_tel_num), 
     h(subcontractor.cscs_card), 
     h(subcontractor.sbcon_type), 
     h(subcontractor.scot), 
     h(subcontractor.ne_eng), 
     h(subcontractor.nw_eng), 
     h(subcontractor.mid), 
     h(subcontractor.se_eng), 
     h(subcontractor.sw_eng), 
     h(subcontractor.ldn), 
     h(subcontractor.wales), 
     h(subcontractor.op_avail), 
     h(subcontractor.ins_prod), 
     h(subcontractor.ins_emp), 
     h(subcontractor.ins_pub), 
     h(subcontractor.ins_con_all), 
     h(subcontractor.approved_status) 
     ] 
    end 
    end 

    def subcontractors 
    @subcontractors ||= fetch_subcontractors 
    end 

    def fetch_subcontractors 
    subcontractors = Subcontractor.order("#{sort_column} #{sort_direction}") 
    subcontractors = subcontractors.page(page).per_page(per_page) 
    if params[:sSearch].present? 
     subcontractors = subcontractors.where("sbcon_name like :search or con_tel_num like :search", search: "%#{params[:sSearch]}%") 
    end 
    subcontractors 
    end 

    def page 
    params[:iDisplayStart].to_i/per_page + 1 
    end 

    def per_page 
    params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10 
    end 

    def sort_column 
    columns = %w[sbcon_name con_tel_num cscs_card sbcon_type scot ne_eng nw_eng mid se_eng sw_eng lon wales op_avail ins_prod ins_emp ins_pub ins_con_all approved_status] 
    columns[params[:iSortCol_0].to_i] 
    end 

    def sort_direction 
    params[:sSortDir_0] == "desc" ? "desc" : "asc" 
    end 
end 

커피 스크립트

jQuery -> 
     $('#subcontractors').dataTable 
      sPaginationType: "bootstrap" 
      sdom: "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>" 
      bProcessing: true 
      bServerSide: true 
      sAjaxSource: $('#subcontractors').data('source') 
      fnServerParams: (aoData) -> 
       for form_element in $('#filter_form').serializeArray() 
       aoData.push 
        name: form_element.name 
        value: form_element.value 
+0

안녕하세요, Ryan,이 디버깅을 위해 사용하고 계십니까? – Abram

+0

아니요. 어디서부터 시작해야할지조차 확실하지 않았기 때문에 필터링 단계를 건너 뛰는 이유가 무엇인지 알 수 없습니다. – RyanMacG

+0

글쎄,이 경우 나는 보통 여러 곳으로 binding.pry를 던지고 어디에서 트리거되지 않는지 확인한다. – Abram

답변

1

Abram이 제안한 바에 따르면 필자가 필터 부분을 살펴본 결과 절대로 호출되지 않았 음을 알았습니다. 다음과 같이 form_tag를 수정하여이 문제를 해결했습니다.

<%= form_tag('#', method: :get, id: "filter_form") do %> 

여기에서 필터가 통과되었지만 무시 된 것으로 나타났습니다. 아브람은 datatables 클래스의 fetch_subcontractors 방법으로 논리를 이동 제안하고 필터가 제대로 작동이 수정이

def initialize(view, subcontractors) 
    @view = view 
    end 
def fetch_subcontractors 
    subcontractors = Subcontractor.order("#{sort_column} #{sort_direction}") 
    subcontractors = subcontractors.page(page).per_page(per_page) 
    if params[:sSearch].present? 
     subcontractors = subcontractors.where("sbcon_name like :search or con_tel_num like :search", search: "%#{params[:sSearch]}%") 
    end 
    if filters = params[:filter] 
     binding.pry 
     subcontractors = subcontractors.where(sbcon_type: filters[:type]) unless filters[:type].blank? 
     subcontractors = subcontractors.where(cscs_card: filters[:cscs]) unless filters[:cscs].blank? 
     subcontractors = subcontractors.where(approved: filters[:approved]) unless filters[:approved].blank? 
    end 
    subcontractors 
    end 

을 반영하고 올바른 결과를 표시하는 동시에 initalize 방법을 변경했습니다.

+0

좋은 작품 Ryan! – Abram

+0

안녕하세요. 검색 및 주문과 같은 모든 기능이 제대로 작동하는지 확인하고 싶습니까? – Abram

+0

위와 같은 느낌이 들지만 검색 용어와 필터가 있으면 필터가 검색어를 덮어 쓰게됩니다. 내가 틀렸다면 나를 수정하십시오. 나는 희망한다! – Abram