从主form_for外部向Rails模型输入check_box_tag值

时间:2014-08-12 23:50:02

标签: ruby-on-rails erb

我正在开发一个市场应用程序。卖家列出要销售的产品。我想创建一个精选列表小部件。所以我创建了一个管理页面,我可以看到所有列出的项目。然后在管理页面上添加了“精选”复选框,以便我可以选择我想要推荐的项目。

然后我进行了迁移,在我的列表模型中添加'featured'作为布尔字段。

如何在我的管理页面html中插入form_for,以便将复选框值输入为1(或true)到列表模型中?

一旦我获得了模型的复选框值,我就可以将该方法添加到我的控制器中以过滤特色列表。

<div class="center">
 <h2>Admin area: All Listings</h2>
</div>

<table class="table table-striped table-bordered">
<tr>
  <th>Image</th>
  <th>Seller</th>
  <th>Name</th>
  <th>Price</th>
  <th>Featured</th>
  <th>Action</th>
</tr>

<% @listings.each do |listing| %>
<tr>
  <td><%= image_tag listing.image.url(:thumb) %></td>
  <td><%= listing.userid %></td>
  <td><%= listing.name %></td>
  <td><%= number_to_currency(listing.price) %></td>
  <td><%= check_box_tag(:featured) %></td>
  <td>
    <div class="btn-group">
      <button type="button" class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown">
        Action <span class="caret"></span>
      </button>
      <ul class="dropdown-menu" role="menu">
        <li><%= link_to "View", listing, class: "btn btn-link" %></li>
        <li><%= link_to "Edit", edit_listing_path(listing), class: "btn btn-link" %></li>
        <li><%= link_to 'Delete', listing, method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-link" %></li>
      </ul>
    </div>
  </td>
</tr>
<% end %>
</table>

2 个答案:

答案 0 :(得分:0)

你可以通过javascript来实现,有很多方法,但是你的形式会有一个简单的解决方案:

<%= f.hidden_field :featured, class: 'hidden' %>

在您的复选框中:

<%= check_box_tag(:featured_checkbox), data: {id: listing.id}  %> #or whatever

并以这种方式附加这些值(jquery):

$(function(){
    $("input[type=checkbox]").click(function(){
        $('.hidden').value($(this).data('id'))
    });
});

免责声明:未经测试但应该可以使用。

编辑: 确保在文档就绪时执行jquery代码段。见上文编辑。

如果您需要解析复选框的值,即使数据不存在,也应保存数据,您可以通过Cookie完成。如果保存记录:

<%= check_box_tag(:featured_checkbox), value: listing.featured, data: {id: listing.id}  %>

无论如何,理解程序比使这段代码更有效(按原样)。

答案 1 :(得分:0)

通常我会通过JS / jQuery和一个很好的post / get请求回到服务器来实现它,感觉这将是一个更好的UX方法。但是,我也为表单方法添加了一个粗略的想法。

JS方法

$(document).ready(function(){
  $("input[type=checkbox]").click(function(){
    $.get('/listings/admin/feature_listing/'+$(this).val(), function(data){
      alert("Listing has been toggled!");
    });
  });
});

不要忘记更新您的路线文件。

表单方法

你基本上必须打破一个新的表单,并将:featured属性分开。

<%= form_tag listing_featured_path, method: :get do %>
<td><%= check_box_tag "listing_featured", "Featured", :value=>listing.featured %></td>
<td><%= submit_tag "Submit" %></td>
<% end %>

然后,您需要在控制器中创建一个新的单独操作,以获取该自定义参数并更新路径。