table中要用一组checkbox来实现多选勾选,最初简单的想法是用一个:house_options来作为栏位,勾选的内容全部放在这个栏位里面。之所以这样想,是因为

<%= f.input :house_options ,collection:["个人出租住宅","品牌公寓","别墅","商铺","车库"],label:"房屋类型",as: :check_boxes %>

以上代码能实现这样:

于是使用这种方式,提交到服务端的参数格式为:

2.3.1 :013 > g.house_options=> "[\"\", \"品牌公寓\", \"别墅\", \"商铺\"]" 

在显示界面要显示用户的房屋类型选择,如果直接用<%= @guest.house_options%>的话,显示结果就是:

["","品牌公寓","别墅","商铺"]

显然这是非常丑的,于是为了美化显示结果,用了gsub()方法,来把多余的符号去掉。gsub参考。

class Guest < ApplicationRecorddef show_option(option)option.gsub!(/[\[\]]/,'');//去掉大括号option.gsub!(/[\"]/,'');//去掉引号option.gsub!(/\,/,' ');//去掉逗号end
2.3.1 :020 > a.gsub!(/[\[\]]/,'')=> "\"\", \"品牌公寓\", \"别墅\", \"商铺\""
2.3.1 :021 > a.gsub!(/[\"]/,'')=> ", 品牌公寓, 别墅, 商铺"[1] pry(#<Guest>)> option.gsub!(/\,/,' ')
=> "  品牌公寓  别墅  商铺"
<div class="col-md-12"><label>房屋类型:</label><% if @guest.house_options.present? %><%= @guest.show_option(@guest.house_options) %><%end%>
</div>

完成以上后美滋滋的保存代码,终于还记得检查一下效果,于是点开edit界面,发现原先选择的check box又重置了,都没有选中。
猜测原因是house_options输入的是string,无法更新check_box的状态。
尝试过使用:

 <%= f.input :house_options ,collection:[["个人出租住宅",0],["品牌公寓",1],["别墅",2],["商铺",3],["车库",4]],label:"房屋类型",as: :check_boxes %>

但是这样的结果只是把显示的["","品牌公寓","别墅","商铺"]变成了["","0","1","2"],并不能解决问题。

中间又查找check_box的默认状态,消耗了一些时间,直到找到collection_check_boxes

collection_check_boxes

collection_check_boxes(object, method, collection, value_method, text_method, options = {}, html_options = {}, &block) public

Returns check box tags for the collection of existing return values of method for object's class. The value returned from calling method on the instance object will be selected. If calling method returns nil, no selection is made.

The :value_method and :text_method parameters are methods to be called on each member of collection. The return values are used as the value attribute and contents of each check box tag, respectively. They can also be any object that responds to call, such as a proc, that will be called for each member of the collection to retrieve the value/text.

参数解说
object是对象
method用来设置选中
collection是check_boxes勾选内容
value_method是check_box的value值
text_method是check_box要显示的勾选内容

举例说明collection_check_boxes

创建option 和 guest_option两个model,guest通过guest_option和option建立多对多的关联。option只需要一个:content栏位。

按照上面关系创建model并关联。

class Guest < ApplicationRecordhas_many :guest_optionshas_many :options,through: :guest_options...

其它关联代码啊省略。。。
form的代码变更为:

<%= f.collection_check_boxes :option_ids,Option.all,:id,:content %>

method参数是:option_ids,于是可以有默认选中功能了
collection参数是Option.all,所以要有option这个model,栏位:content,用来做勾选项目的显示文字
value_method参数是:id,这里以option的id作为value值

编辑controllers/backend/guests_controller.rb,添加:option_ids=>[]permit()方法里。

console查看提交的option_ids参数:

"option_ids"=>["", "1", "4", "5"]

页面要显示选中的房屋类型就不需要再做字符串变换了:

<label>房屋类型:</label><% if @guest.options.any? %><% @guest.options.each do |option|%><%= option.content %><% end %><% end %>


collection_check_boxes的应用相关推荐

最新文章

  1. 现在学java还是python好_该学Java还是Python?
  2. 【2021年度训练联盟热身训练赛第二场】Binarize It(python)
  3. 郑州商品交易所与阿里云达成合作,推进核心数据分析平台建设
  4. mysql 全连接查询合并字段
  5. 优化 Hive ETL 任务(参数篇)
  6. Linux 中断学习之小试牛刀篇---Linux中断内核编程
  7. if or函数套用_excel常用函数用法解析第二篇——SUMPRODUCT、AND、OR、IF函数
  8. Docker_制作docker镜像
  9. 软件测试 实验一 软件测试案例分析
  10. 【网页前端】HTML基本语法之排版标签和表单标签
  11. OKR如何与绩效考核并行?
  12. arcengine双击属性表内的一行,定位到该要素,并添加到选择集
  13. java的LocalDateTime类来获取当天时间、前一天时间,本周的开始和结束时间、本月的开始和结束时间
  14. 《都挺好》:苏明哲的老婆吴非这句话戳中所有大龄程序员的痛点!
  15. 统计行业板块内涨停板数量,跟踪热点板块!股票量化分析工具QTYX-V2.6.0
  16. css 里面写响应式布局,CSS3怎么做出响应式布局
  17. 捕鱼问题 matlab,鱼捕捞问题(数学建模).docx
  18. python 删除pdf页面_Python脚本使用pyPDF删除空白页面
  19. Java可变类型与不可变类型
  20. 批处理获取系统安装时间/系统开机时间/电脑唤醒时间及开机使用时间(二)完成

热门文章

  1. CKfinder 和 CKEditor 在 ASP.NET 下的配置
  2. 网络常用命令收藏与整理
  3. 原创:检查点的三种加入方式
  4. 【按住你的心】——Android开发运行属于自己的Hello,World!
  5. fastjson总结
  6. Microsoft Operations Management Suite 集成 SCO
  7. CrazePony飞行器--通信部分介绍【转】
  8. 操作系统实验之作业调度算法
  9. 打开MySQL数据库远程访问的权限
  10. SAE上传web应用(包括使用数据库)教程详解及问题解惑