【问题标题】:Input a check_box_tag value into a Rails model from outside the main form_for从主 form_for 外部将 check_box_tag 值输入到 Rails 模型中
【发布时间】:2014-08-12 23:50:01
【问题描述】:

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

然后我进行了迁移以在我的列表模型中添加“特色”作为布尔字段。

如何在下面的管理页面 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>

【问题讨论】:

  • 例如,如果我想在主页上展示 10 个特色产品,并且我想每隔几天更换这些产品。我希望能够转到管理页面并根据需要选中/取消选中。

标签: ruby-on-rails erb


【解决方案1】:

通常我会通过 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 %>

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

【讨论】:

  • 谢谢,澄清一下,如果我采用JS的方法,我应该把JS放在哪里?在特色列表 html 页面中?如果我这样做,那么当我选中/取消选中管理页面中的复选框时,该页面只会更新精选列表?我理解对了吗?
  • 通过获取请求进行更新很麻烦。
  • @Moosa 作为一个好习惯,你应该把它放在 application-jquery.js 中。但您也可以将其放在特色列表页面的底部。完成后,您需要添加路由,并添加控制器操作。是的,它一次只能在一个复选框上工作,您可以使用 chrome 开发工具检查器查看它是否工作,并查看“网络”选项卡。
  • 你为什么用get而不是post?如果复选框被选中/取消选中,我想将该值发布到模型中,以便稍后在不同的视图中使用它。你能给我这种形式的方法吗? JS 解决方案没有按我的预期工作。
  • 您可以获取或发布,正如我上面所说的......基于表单的解决方案也在上面。这些是 2 个单独的解决方案。
【解决方案2】:

你可以通过 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 sn-p 在文档就绪时执行。见上文已编辑。

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

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

无论如何,理解这个过程比让这段代码工作(按原样)更重要。

【讨论】:

  • 你能再详细说明一下吗?我在新的列表表单中输入了 hidden_​​field。我在我的管理页面中输入了 check_box_tag 和 js。那正确吗?这不会将我的模型“特色”字段更新为 1。当我刷新管理页面时,复选框再次为空白。我需要能够根据需要更改特色项目,因此该复选框需要可编辑,因为当我选中它时,模型字段为 1,当我取消选中时,它又回到 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多