使用Rails 3.1中的JQuery下拉框发布到控制器

时间:2011-11-10 15:17:17

标签: javascript jquery ruby-on-rails

我在搜索控制器的索引视图中有以下HTML下拉框。我想根据保管箱选择更新视图。我需要以某种方式将选择传递给控制器​​。

<!-- index.html rendered from Search/Index -->
<select id="search_params" name="search[params]">
   <option value="tacos">tacos</option>
   <option value="pizza">pizza</option>
</select>

搜索控制器代码接受参数并吐出消息

def index
  query = params[:search]
  msg = "Your favorite food is #{query}! OMGWTFBBQ!?!?!?!"

  respond_to do |format|
    format.html
    format.js
  end
end

这个Javascript应该以某种方式在选择时将下拉框选项发布到控制器:

$("#search_params").change(function() {
  var state = $('select#search_params :selected').val();
  if(state == "") state="0";
   //Send the selection to the controller Search controller somehow 
   // and then render a new view immediately ?
   //I AM NOT GOOD WITH COMPUTER
})
return false;
});

我已经看过其他几十个Rails + JQuery示例,jquery API文档等等。无法找到简单问题的答案,或者我只是在思考它。

无论如何,提前感谢您的帮助! 〜丹

2 个答案:

答案 0 :(得分:1)

我不是Ruby / Rails的人,但我知道jQuery。

我想你想要像

这样的东西
$("#search_params").change(function() {
  var state = $('select#search_params :selected').val();
  if(state == "") {
     state="0";
  }
  //Call jQuery AJAX
  $.ajax({
       url:'/path/to/your/controller/action',
       type:'POST',
       data:'search=' + state,
       success: function(data) {
           alert(data);
       },
       error: function() { 
          alert('Stuff went wrong');
       }
    });
  return false;
});

希望这会有所帮助,并阅读jQuery AJAX doc page

我不确定你是如何从控制器返回数据的?是否有相应的视图呈现msg

答案 1 :(得分:1)

结帐jQuery.ajax()文档:http://api.jquery.com/jQuery.ajax/

您可能需要将它放在application.js的顶部(或者这可能只是Rails 2.x的要求):

// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
jQuery.ajaxSetup({
  'beforeSend': function(xhr){
    xhr.setRequestHeader("Accept", "text/javascript");
    var token = $("meta[name='csrf-token']").attr("content");
    xhr.setRequestHeader("X-CSRF-Token", token);
  }
});

我设置jQuery.ajax()以期望服务器响应中的原始javascript代码。

我的普通html模板呈现部分。或者,所有HTML都被抽象为部分HTML,而不是模板。

javascript模板将呈现基本上这样做:

$("div#some_id").html(
  <%= escape_javascript(render(:partial=>'partial_name')) %>
);