2014-10-01 64 views
0

在我的应用我有下面的代码模式:变化范围(Rails的3.2,jQuery的)

.modal-body 
    .row 
     .col-sm-4 
     .btn-group-vertical#gear-buttons-list 
      - Gear.all.each do |gear| 
      .btn.btn-large.btn-default.gear-button{"data-id" => gear.id} #{gear.name} ($#{gear.charge}) 

我提出有名称按钮列表收取一块齿轮供用户选择。然而,在页面的其他地方有一个下拉栏,让用户选择一个类别。在我的应用程序,一个类别的has_many齿轮,和我想的模式,以仅显示与已经选择的类别相关联的齿轮,如以下作用域在Gear.rb定义:

scope :moving, -> { where(category_id: 1) } 

是有一种直接的方式来编码模式中的.each循环,以便根据所选的类别动态限制其范围。

这是我在jobs.js尝试(将其更改为jobs.js.erb后):

if($('#job_category_id').length > 0) { 
    $('#job_category_id').change(function() { 
     var categoryID = $(this).val(); 
     var categoryName = _categories[categoryID].name; 
     $("#gear-buttons-list").html(""); // clear default buttons 
     $("#gear-buttons-list")   // append new buttons 
     .append("<% Gear." + categoryName + ".each do |gear| %><div class='btn btn-large btn-default gear-button' "data-id" => gear.id><%= #{gear.name} %></div><% end %>"); 
    }); 

这是不行的,显然是因为我试图做字符串连接在嵌入的Ruby的方式(获得syntax error, unexpected tSTRING_BEG错误)。也许有人可能用这个指向我的正确方向?

回答

0

您需要更新页面(从服务器再次获取),或者每次更改类别时至少需要带齿轮的片段。现在你试图在浏览器中执行Ruby代码,这显然不起作用。

+0

什么是“明显”是每个开发者不同,因为我们每个人都有不同数量的知识和经验。无论如何,事实证明,我可以使用Ajax来避免每次更改类别时更新页面(除了我们之外,对于许多人来说,这可能是“显而易见”的;))。 – sixty4bit 2014-10-02 04:03:12

0

解决此使用Ajax:

1)I使jobs.js以下Ajax请求(的categoryID从早期呼叫衍生val()

$.ajax("/gears", {dataType: "script", data:{category_id: categoryID}}) 

2)在gears_controller.rb

def index 
    @gears = Gear.where(category_id: params[:category_id]) 
end 

3)控制器呈现齿轮索引,这是.js.erb,它反过来呈现一个集合部分瓦特第i个每个齿轮一个按钮:

/views/gears/index.js.erb 

$("#gear-button-list").html("<%=j render partial: '/gears/gear_buttons', collection: @gears, as: :gear %>") 

4)部分:

.btn.btn-large.btn-default.gear-button{"data-id" => gear.id} 
    %p 
    %h5 
     #{gear.name} ($#{gear.charge}) <br /> 
     %small #{gear.description}