我想要完成的是一个简单的“切换”复选框,用于包含模型记录的视图的开/关。
我试图查看“隐藏”值,但似乎没有按预期工作。
How to get blank checkboxes to pass as false to params
当我添加:<%= hidden_field_tag "category_ids[]", '' %>
取消选中时,我会收到Couldn't find Category with 'category_name'=
。
基本上,该表格为Model.all
,但我希望能够将is_active
列的键值修改为true
或false
,具体取决于是否是否检查了该框。目前,我可以通过“检查”框来完成此操作。但是,不要取消选中(通过null
)。我正在努力完成这一切,而不是制作我的所有支票,而另一个通过我的未经检查。并且,也绕过了显示/编辑过程。表大小相当小,所以我不关心延迟。
我试图尽可能多地搜索,但我不知所措。我发现我可以做其中一个,但不幸的是,不过两个,我非常感谢任何指导。
我的观点:
<h4>Categories</h4>
<%= form_tag enable_categories_path, method: :put do |f| %>
<table id="myTable" class="table table-bordered table-striped">
<tr>
<th>Enable</th>
<th>Category Name</th>
<th>Active</th>
</tr>
<tbody>
<% @categories.each do |category| %>
<tr>
<td>
<%= check_box_tag "category_ids[]", category.id, category.is_active == 1 ? 'checked' : nil %>
</td>
<td><%= link_to category.category_name, category %></td>
<td><%= category.is_active == 1 ? 'Yes' : 'No' %></td>
</tr>
<% end %>
</tbody>
</table>
<%= render 'settings/button' %>
<% end %>
这里,复选框是从模型本身获取相应记录的状态,因此如果没有对复选框采取任何操作,它将保持不变(或通过状态返回)
我的控制器:
class CategoriesController < ApplicationController
before_action :set_category, only: [:show, :edit, :update]
def index
@categories = Category.all.order(:category_sort)
end
def show
@category = Category.find(params[:id])
end
def edit
end
def update
if @category.update(category_params)
redirect_to categories_path
else
render :edit
end
end
def enable
Category.update(params[:category_ids], params[:category_ids].map{ |e| {is_active: true} })
redirect_to categories_path
end
private
def set_category
@category = Category.find(params[:id])
end
def category_params
params[:category].permit(:id, :category_name, :is_active)
end
end
目前,我只传递is_active:true,直到我能找到一种方法来传递所有复选框状态。
我的模特:
class Category < ActiveRecord::Base
self.table_name = 'categories'
has_many :metrics
end
我的路线:
resources :categories do
collection do
put :toggle
end
end
对于复选框,所有内容似乎都正确传递。但是,当未选中某些内容时,日志中不会显示任何内容。
答案 0 :(得分:1)
当我在Rails中遇到这样的情况时,我通常最终使用AJAX而不是批量分配。这实际上相当容易。对我来说至少比学习check_boxes
和collection_check_boxes
,LOL
一个简单的分类表:
<table>
<thead>
<tr>
<th>Category</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<% @categories.each do |category| %>
<tr>
<td><%= category.category_name %></td>
<% status = category.is_active? ? 'Active' : 'Inactive' %>
<td id="<%= category.id %>" ><button class="button_<%= status %>"><%= link_to status, toggle_active_path(:id => category.id), :method => :post, :remote => true %></button></td>
</tr>
<% end %>
</tbody>
</table>
要注意的是设置status
变量的嵌入式ruby。这用于设置按钮的类的值。在CSS文件中,按钮类button_Active
将颜色设置为绿色,button_Inactive
将颜色设置为红色。它还使用此变量来设置按钮的文本。
在控制器中创建一个切换状态的方法:
def toggle_is_active
@category.toggle!(:is_active) #flips the boolean on is_active
respond_to do |format|
format.html { redirect_to(@category) }
format.js
end
请注意.toggle!
将绕过模型验证并保存。如果您需要确保运行验证,可以使用@category.toggle(:is_active).save
这将响应format.js并调用一个名为toggle_is_active.js.erb的非常小的文件:
$('#<%= @category.id %>').html('<%= escape_javascript(render :partial => 'toggle_active') %>');
这是我们设置为表格行中类别的id
的html元素的id。
这会调用部分名为_toggle_active.html.erb
并使用新的html更新相应的<td>
:
<% status = @category.is_active? ? 'Active' : 'Inactive' %>
<button class="button_<%= status %>"><%= link_to status, toggle_active_path(:id => @category.id), :method => :post, :remote => true %></button>
现在您只需要一条访问AJAX链接的路径:
routes.rb中:
post 'toggle_active' => 'categories#toggle_is_active'
这是一个可以在github上克隆的工作示例。它有样式表来获得上面的外观。我想你几乎可以在任何情况下推断这个:
答案 1 :(得分:0)
让我们考虑一下这里发生了什么:
def enable
Category.update(params[:category_ids], params[:category_ids].map{ |e| {is_active: true} })
redirect_to categories_path
end
你能发布params[:category_ids]
看起来像什么吗? map
这里没有意义。另外,数据库中is_active
的数据类型是什么?