好的——这里发生了很多事情。首先,我假设您使用的是 rails 3 或 rails 4
而且它看起来像嵌套在想法模型中,这里没有考虑到,你必须为此修改代码。
首先 - 尽量不要直接调用视图中的模型,除非你绝对必须这样做,这应该在你的控制器中完成。此外,在您看来,请确保您有一个用于稍后要进行的 jquery 调用的分类法的绑定元素。
your_main_view_referenced_in_your_question.html.erb
<h3>Stores Offered In</h3>
<ul class="multi-column-checkbox">
<%- @stores.each do |store| %>
<li>
<%= check_box_tag "store[ids]", store.id, false, :data => {:remote => true, :url => url_for( :action => 'get_taxonomies', :id => store.id ), :method => :put}, :class => 'input-large' %>
<%= store.name %>
</li>
<% end %>
</ul>
<br/>
<div id="taxonomies">
</div>
接下来,您需要创建一个控制器操作来响应您的 ajax 调用。
stores_controller.rb
### Add an action to let you do an ajax call
def get_taxonomies
@store = Store.find params[:id]
end
现在您需要创建一个从控制器操作呈现的 ujs 文件
get_taxonomies.js.erb
if ($(".store_" + <%= params[:id] %>).length) {
$(".store_" + <%= params[:id ] %>).remove();
} else {
$('#taxonomies').append("<%= escape_javascript(render(partial: '/stores/taxonomy', locals: {stores: @stores } )) %>");
}
if ($("[class^=store_]").length > 0) {
if ( $('#taxonomies').find('h3').length ) {
// do nothing - leave the h3 where it is
} else {
$('#taxonomies').prepend("<h3>Store Taxonomies</h3>");
}
} else {
$('#taxonomies').find("h3").remove();
}
现在,虽然您可以将所有 html 内联写入 js 文件,但如果您将其放入部分文件中,稍后编辑它会更难看且更容易 - 因为 js.erb 文件正在调用分类法,所以您需要使用部分文件一样的名字
_taxonomy.html.erb
<div class="store_<%=@store.id%>">
<h4><%= @store.name %></h4>
<ul class="multi-column-checkbox">
<%- @store.taxonomies.each do |taxonomy| %>
<li>
<%= check_box_tag "[taxonomy_ids][]", taxonomy.id, false %>
<%= taxonomy.name %>
<% end %>
</li>
</ul>
</div>