当前位置: 首页 > news >正文

%check_box% in rails :coditions={:has_many , :through}

刚才算是把rails里的checkbox透彻的理解了一下

在railscast关于check box讲解的那一集里,提到了check box在habtm中的用法,简单的说一下,还是通过实例:
现在有product和category两个模型,
那么在模型中声明:
#category
has_and_blongs_to_many products
#product
has_and_blongs_to_many category

还要记得加上中间的连接表categories_products,加上外键字段product_id, category_id
在数据库迁移中,product有name:string,在category中也加上

一切都搞定之后,重点看视图中的内容,就是在new和edit模板引用的那个_form局部模板中在submit按钮之前,添加下面的代码:

InBlock.gif<% categories.each  do |category|%>
InBlock.gif    <%= check_box_tag  "product[:category_ids][]",
InBlock.gif                                    category.id,
InBlock.gif                                   @product.categories.include?(category)%>
InBlock.gif        <%= category.name%>
InBlock.gif<% end %>

product[:category_ids][]是check box 的name属性,这里声明为一个数组.
category.id 是check box对应的value属性
@product.categories.include?(category) 这是默认选择的设置,在edit调用时,@product是传入的对象,执行这句会得到true 或者false,也就会出现对应的是否默认checked

那么还有一点注意的就是当check box 不提交任何内容的时候,在发送params时,product[:category_ids][]数组就不出现在参数里,所以也就不会在action中执行任何动作.

所以在update这个action中,一定要说明product[:category_ids][]为空情况该怎么办:

params[:product][:category_ids] ||=[]

这就告诉rails在update动作的时候注意params[:product][:category_ids]到底有值传过来没有,如果没有就赋为空数组.

剩余的事情就交给rails来搞定了..因为这里的product的category_ids方法是habtm里自带的,所以你可以这么用


但是换种情况,通过has_many , through来连接两个模型呢?

下面通过一个例子来说明:

譬如在学生选课系统中,因为中间表要加入成绩字段,所以必须做成是has_many , through方式来实现.
环境mac, rails 1.2.5 , mysql5.0, IDE:textmate

apples-acpi:project mac$ rails product

apples-acpi:project mac$ cd product


apples-acpi:product mac$ ruby script/generate scaffold_resource student name:string 

apples-acpi:product mac$ ruby script/generate scaffold_resource course name:string 

apples-acpi:product mac$ ruby script/generate model relation student_id:integer course_id:integer score:integer

apples-acpi:product mac$ mysqladmin -u root create product_development


apples-acpi:product mac$ ruby script/server


首先打开[url]http://localhost:3000/courses[/url]
添加几项course数据

在students/view中把new和edit的那段表单代码放到_form.rhtml中,修改之后如下:






因为这里关系已经不是habtm了,所以如果提交表单的话会出现错误,所以在student.rb中写入 course_ids=



这里是一个数组计算的问题,那么怎么更新relations中的数据呢,对于某一个student对象来说,设提交的数组为commit_array, 原先存在数据库中的关系数组为db_array, 那么需要添加的数据就是commit_array-db_array, 需要删除的数据就是db_array-commit_array

举个例子来说
如果提交的commit_array为[1,2,3,4]原来数据库中存储的是[1,2,3]很明显,需要在数据库中添加[4],也就是commit_arry-db_array

如果提交的commit_array为[1,2],原来数据库中存储的是[1,2,3,4]那么,需要删除[3,4]也就是db_array-commit_array

这样就实现了这个_ids的属性.




本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/113342,如需转载请自行联系原作者

相关文章:

  • 今天您脚本了吗?
  • 快速构建Windows 8风格应用11-语义缩放
  • btrfs的使用(案例讲解)
  • 针对nginx、haproxy、lvs 的优缺点分析
  • Asp.net中Json数据的转化,读取与应用
  • Octave添加package方法
  • 【Android Demo】Android中取得手机屏幕大小
  • JFace中的表格型树TableTreeViewer
  • IE8中HTTP连接数目的变化
  • 实时游戏对战引擎Photon
  • python入门系列之一:Centos6下python2.7的安装
  • Skype For Business 2015实战系列19:统一通讯之配置Exchange 2013 SP1
  • nginx部署
  • redhat 6.5 配置WAS控制台中文
  • filebeat 配置文件详解
  • __proto__ 和 prototype的关系
  • 〔开发系列〕一次关于小程序开发的深度总结
  • C++类的相互关联
  • scrapy学习之路4(itemloder的使用)
  • Zsh 开发指南(第十四篇 文件读写)
  • 构建二叉树进行数值数组的去重及优化
  • 记一次用 NodeJs 实现模拟登录的思路
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 入口文件开始,分析Vue源码实现
  • 使用 @font-face
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我看到的前端
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (06)金属布线——为半导体注入生命的连接
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (八)Flask之app.route装饰器函数的参数
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (十一)手动添加用户和文件的特殊权限
  • (原創) 未来三学期想要修的课 (日記)
  • (转)iOS字体
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CLR Hosting 简介
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET的数据绑定
  • .net网站发布-允许更新此预编译站点
  • .NET下的多线程编程—1-线程机制概述
  • @JsonSerialize注解的使用
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [BZOJ1053][HAOI2007]反素数ant
  • [Contest20180313]灵大会议
  • [CTSC2014]企鹅QQ
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [HDU 3555] Bomb [数位DP]
  • [HNOI2006]鬼谷子的钱袋