0

我有以下代码

模型

class Tender < ActiveRecord::Base
attr_accessible :title, :buyer_name, :category, :opening_date, :closing_date, :bid_amount, :description, :status

end

控制器(索引操作)

class TendersController < ApplicationController

    before_filter :signed_in_user


  def index
    if signed_in?
         @tenders= Tender.where("company_id= ? ", current_user.company.id )  

    end

    respond_to do |format|
      format.html # index.html.erb
      format.js
      format.json { render json: @tenders }

    end
  end

查看(索引页)

<div class="span6 offset3" >  


        Filter by status &nbsp;

        <%= form_tag tenders_path, :remote => true, :method=>'post' do %>
            <%= select_tag("status", options_for_select([['Open', 'Opem'],
                ['Closed', 'Closed'],['Won','Won']])) %>

        <% end %>                       

        <div id="flash"> </div>    

    </div>

</div>


<table border="1" id="tender_table">
  <tr>
    <th>Title</th>
    <th>Bid amount</th>
   </tr> 

<% @tenders.each do |tender| %>
  <tr>
    <td><%= tender.title %></td>
    <td><%= tender.status %></td>    
  </tr>
<% end %>
</table>

我也有tenders.js.coffeeindex.js.erb

我正在使用 rails 3.2.2 和 ruby​​ 1.9

我想要做的是,让用户从组合框中选择一个状态。然后使用 onchange 事件,我想将选定的值发送到控制器操作(我认为它应该是索引操作,但如果我错了,请纠正我)。根据选择的状态,我想从数据库中获取投标列表并将这些列表发送到视图,以便它将在索引页面上显示(替换当前表)。到目前为止,我正在尝试使用 Ajax。任何帮助将不胜感激。我在这上面花了 4 天多的时间,却不知道该怎么做。

如果您需要更多解释,原始问题就在这里。顺便说一句,我也无法弄清楚 onchange 事件是否可以使用 jquery、javascript 甚至原型在tenders.js.coffeeindex.js.erb

4

2 回答 2

1

我在想 AJAX 不是解决您问题的唯一方法。也许您可以在 DOM 中标记您的 Tenders,然后直接使用 javascript 隐藏和显示它们。考虑一下:

#tenders/index.html.erb
#...
<% @tenders.each do |tender| %>
  <tr class="<%= tender.status %>">    <!-- Now we know which ones are closed -->
    <td><%= tender.title %></td>
    <td><%= tender.status %></td>    
  </tr>
<% end %>
#...

$(document).ready(function(){
  $('#my_select_box_id').change(function(){
    var class = $(this).val();
    $('tr.' + class).show();
    $('tr[class!=' + class + ']').hide();
  });
});

也应该更快,因为不涉及后端请求。这对我来说更有意义,因为模板在渲染时已经拥有了它需要的所有信息,所以不需要用另一个请求来打扰后端。祝你好运。

于 2012-07-13T06:42:33.977 回答
0

这很容易做到,但你必须在很多地方做一些小事。我认为 Ajax 是正确的选择。正如您所说,首先您需要一个控制器操作来处理 AJAX 请求。这可能是您的索引操作,但对我来说,它看起来更像是一个搜索操作。

class TendersController < ApplicationController
  # You can extend this later if you need to search by other options
  # Just coding for today ;-)
  def search_by_status
    @tenders = Tender.find_all_by_status params[:status]

    #I think this does not even have to be here
    respond_to do |format|
      format.js
    end
  end
end

然后你应该创建一个模板tenders/search_by_status.js.erb(它甚至可以是search_by_status.html.erb,但我想表明这个模板是由AJAX使用的)并将你的标记放在那里。

然后使用 jQuery(我不怎么使用 CoffeeScript)你可以这样做:

$(document).ready(function(){
  $('#my_select_box_id').change(function(){
    $.ajax({
      url: 'tenders/search_by_status?status=' + $(this).val() //or your custom address
      success: function(serverResponse){
        $('#my_target_element_id').html(serverResponse);      //update the DOM
      }
    })
  });
});

或者您可以将此行为封装在一个 javascript 伪类中,并且只在 $(document).ready 中调用 PseduoClass.init() ,但这是一个简单的解决方案,您可以稍后进行调整。

我正在做这个,所以有些事情可能不是 100% 准确,但通常它应该有效。让我知道是否有任何问题;-)。

于 2012-07-13T06:31:38.920 回答