2014-11-04 51 views
0

我的表單有基於先前選擇選擇部分的選項。選擇該部分後,我需要統計並顯示該部分有多少個問題。使用嵌入式jQuery的Rails查詢

我想計算的問題,但無法弄清楚語法。這裏我試圖在每次選擇節時更新@count變量。然後將@count值分配給我的表用於添加行的隱藏字段。

你如何做這個查詢? $('#question_section')是錯誤的語法。

$('#question_section').change(function() { 
      <% @count = Question.where(section: $('#question_section')).count %> 
      $('input[name="question_count"]').val(<% @count %>); 
    }); 
+0

請檢查想法和更好的方法來解決這個問題。謝謝。 – Rubyrider 2014-11-04 18:41:33

回答

1

需要更多信息。基本上是你的觀點的代碼。我不認爲你需要在你的jQuery中寫任何rails的查詢。這很容易。

到目前爲止,我假設,從您的表單用戶將收到部分的問題的選擇。所以這些步驟應該在後面。

您將在您選擇的httm輸入上綁定更改事件。

$("#question_section").on(function(){ 
    var value = $(this).value() // get whats the section value/text 
}) 

現在在您的控制器中添加一個動作,您將在其中查詢問題。所以對此你需要做的事情。註冊服務商在路由中的行爲如下:

resources :questions do # I assume there is a questions resource 
    get :count, on: :collection 
end 

現在,這將爲您提供一個url作爲該行爲的路由。現在讓我們再次回到javascript部分。

$("#question_section").on(function(){ 
    var value = $(this).val() // get whats the section value/text 
    $.ajax({ 
      url: '/questions/count.js', // you can skip the format here 
      data: {section: value} 
      success: function(data){ 
        $('input[name="question_count"]').val(data) 
      } 
    }) 
    }) 

所以現在我們已經準備好了腳本。現在讓我們移動到控制器。

def count 
    number_of_questions = Question.select("DISTINCT(section)").where(section: params[:section]).count 
    render :js => number_of_questions 

嗯,這是你可以遵循的步驟。在視圖層直接查詢是不可接受的。以責任爲中心的設計並不鼓勵這一點。我希望我能用我的方法提供一些提示。

+1

我喜歡它,今天將與此合作並回復。 – DDDD 2014-11-04 18:44:15

+0

如果您需要任何幫助,請聯繫我。 @DDDD隨時:) – Rubyrider 2014-11-04 18:46:40

0

這段代碼的問題是,<%和%>之間的一切都只有一次評估服務器上。其餘的代碼在之後評估爲JavaScript在瀏覽器。你必須要揭露一些控制這個查詢:

Question.where(section: $('#question_section')).count 

...然後每次索要數據服務器的用戶改變了選擇:

$('#question_section').change(function() { 
 
    var url = "/path/to/your/service/" + $(this).val(); 
 
    $.get(url, function(data) { 
 
    $('input[name="question_count"]').val(data.count); 
 
    } 
 
});

+0

你的服務路徑是什麼?控制器方法?你將如何寫入JS中的控制器方法的路徑? – DDDD 2014-11-04 18:01:26

0

我假設section屬性是一個字符串或整數。再次假設id='question_select'的HTML元素是<select>標記,代碼$('#question_section')的jQuery行將返回一個jQuery對象(本質上是一個javascript對象)。 而在代碼爲Question.where(section: $('#question_select'))的ActiveRecord查詢接口行中,當預期根據section的數據類型預計StringFixnum(ruby中的整數)對象時,您已插入jQuery對象。這就是它給出錯誤的原因。

爲了解決這個問題,你可以做以下 - >

  1. 在JavaScript

    <script type="javascript"> 
        $(document).ready(function(){ 
        $('#question').on('change',function(){ 
         var url = window.locatio.origin + '/questions/get_number_of_questions' 
         var data = { section : $('#question_select').val() }; 
         $.ajax({ 
         type: 'POST', 
         url: url, 
         data: data, 
         success: function(result){ 
          $('input[name="question_count"]').val(result[count]); 
         } 
         }); 
        }); 
        }); 
    
  2. 在你routes.rb文件中定義的路由類型後的動作get_number_of_questionsquestions

    resources :questions do 
        collection do 
        post :get_number_of_questions 
        end 
    end 
    
  3. 最後,在你的questions_controller.rb文件中定義的動作

    class QuestionsController < ApplicationController 
        ... 
    
        def get_number_of_questions 
        count = Question.where(section: params[:section]).count 
        render :json { count: count } 
        end 
    
        ... 
    end 
    

記住要保持你的JavaScript和導軌或Ruby代碼作爲單獨越好。這是RoR公約之下采用的最佳做法之一。 希望這會有所幫助 謝謝。