2014-11-04 52 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公约之下采用的最佳做法之一。 希望这会有所帮助 谢谢。