自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源,深入理解下 向数据库插记录时经常会用到new, build, create。这三个方法很容易混淆
save:rails中的save其实是create_or_update,新建或修改记录!不一定是新建,切记 new :只是在内存中新建一个对象,操作数据库要调用save方法。 create = new + 执行sql。 build:与new基本相同,多用于一对多情况下。还有一个不同请看使用示例 !:new!, create!, build!与new, create, build的区别是带!的方法会执行validate,如果验证失败会抛出导常。 save是实例方法,而create, build, new是模型类的类方法
还有另外一种说法,也挺好,如下     首先说new吧,app = App.new(params[:app]),这个是用给定的params来实例化一个app对象,注意此时只是初始化了一个对象,ruby只是在内存里面给app分配了一个内存地址,但是,这 个地址还没有指定任何的有效的内存,所以接下来ruby要做的就是调用model里面的initialize函数来根据给定的参数进行初始化这个对象,并将该对象保存到堆里面。     对于new!来说,这个跟new相比,就是在save到数据库的时候,如果save失败,就会报一个错误。     对于create来说,过程大致跟new差不多,唯一的区别是,create = new + save,即create一步操作等于new和save的两部操作。     对于create!来说,类似于new! 过程大致也是跟new!差不多 区别是create! = new! + save  如果保存失败的话会返回一个错误。     对于build来说,主要的混淆的地方在于与new的区别,其实,我认为build是new的一个别名,但是用的地方可能跟new有点区别,在我看来,build大多是用于有关联关系的对象模型的时 候,用来创建子model用的,比如说 Person  与 Order是一对多的关系,那么我们可以用 @persion.build()方法来创建于该person对应的orders

下面有一个简单的示例:

  1. 本来是想用accepts_nested_attributes_for写一个nested form
本来是想用accepts_nested_attributes_for写一个nested form
  1. class User < ActiveRecord::Base
  2. attr_accessible :email, :account_attributes
  3. has_one :account
  4. accepts_nested_attributes_for :account
  5. end
  6. class Account < ActiveRecord::Base
  7. attr_accessible :password, :password_confirmation
  8. has_secure_password
  9. belongs_to :user
  10. end
  11. class UsersController < ApplicationController
  12. defnew
  13. @user = User.new
  14. end
  15. end
class User < ActiveRecord::Base
attr_accessible :email, :account_attributes
has_one :account
accepts_nested_attributes_for :account
end class Account < ActiveRecord::Base
attr_accessible :password, :password_confirmation
has_secure_password
belongs_to :user
end class UsersController < ApplicationController
def new
@user = User.new
end
end

view里

  1. <%= form_for @userdo |f| %>
  2. email: <%= f.text_field :name %>
  3. <%= f.fields_for :accountdo |account_form| %>
  4. password: <%= account_form.password_field :password %>
  5. password_confirmation: <%= account_form.password_field :password_confirmation %>
  6. <% end %>
  7. <% end %>
<%= form_for @user do |f| %>
email: <%= f.text_field :name %>
<%= f.fields_for :account do |account_form| %>
password: <%= account_form.password_field :password %>
password_confirmation: <%= account_form.password_field :password_confirmation %>
<% end %>
<% end %>

一开始无法显示account里的内容,后来发现没有在controller里build account, 于是

  1. class UsersController < ApplicationController
  2. defnew
  3. @user = User.new
  4. @user.account.build
  5. end
  6. end
class UsersController < ApplicationController
def new
@user = User.new
@user.account.build
end
end

报错 undefined method `build' for nil:NilClass
刚开始怎么也想不通,隔了一天去翻http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html 才发现原来has_one的build方法是build_association而不是collection.build。因为不常用has_one,rails里“约定”又比较多,才会当has_many的方法来写。
把controller里改成

  1. class UsersController < ApplicationController
  2. defnew
  3. @user = User.new
  4. @user.build_account
  5. end
  6. end
class UsersController < ApplicationController
def new
@user = User.new
@user.build_account
end
end

程序才正常跑起来
一言蔽之 在has_many中:User#accounts.build 在has_one中:User#build_account

rails 中 create, new, build, save 的用法以及误区汇总 (转)的更多相关文章

  1. rails 中 create, new, build, save 的用法以及误区汇总

    自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的create,new,build等方法不是很了解,用的很混乱,导致经常出现不必要的bug,很苦恼,决定,总结一下,结合网上已有资源 ...

  2. Rails中的增删改查

      1.        rails中类与对象与SQL中表与行的关系 rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为o ...

  3. rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明

    原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html  rails中path.url路径解析,routes信息,form_for剖析,link_to ...

  4. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  5. [转载]C#中as和is关键字的用法

    这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下. 原文链接:http://www.jb51.net/article/80944.htm#comments  在程序中,进 ...

  6. Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数:  ...

  7. 理解ruby on rails中的ActiveRecord::Relation

    ActiveRecord::Relation是rails3中添加的.rails2中的finders, named_scope, with_scope 等用法,在rails3统一为一种Relation用 ...

  8. 转载 : Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结 投稿:jingxian 字体:[增加 减小] 类型:转载 时间:2013-11-14我要评论 本文是 ...

  9. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)

    ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) 时隔1年,再回来总结这个问题,因为它是ros+python开发中,太常用的一个操作,需要 ...

随机推荐

  1. Linux下source文件两种方法

    1.直接source命令加文件 source /etc/rc.d/init.d/functions 2.点(.)加文件 . /etc/rc.d/init.d/functions

  2. sql server partition分区与group by 分组

    例子:在一个StudentScore表中,有序号ID,班级ClassId,学生姓名Name,性别Sex,语文成绩ChineseScore,数学成绩MathScore,平均成绩AverageScore等 ...

  3. C# 实用小类

    /// <summary> /// 汉字转换拼音 /// </summary> /// <param name="PinYin"></pa ...

  4. tinymce与prism代码高亮实现及汉化的配置

    简单介绍:TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持.功能方强大,并且功能配置灵活简单.另一特点是加 ...

  5. WPF 触摸屏多点触控图像的缩放旋转和移动

    <dxc:DXWindow xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:d ...

  6. @componentscan注解的用法和作用

    刚刚开始学习spring boot,在application中忘记加上@componentscan,倒置web请求一直没有都是404,@componentscan的作用如下: @ComponentSc ...

  7. AHOI2012 信号塔 | 最小圆覆盖模板

    题目链接:戳我 最小圆覆盖. 1.枚举第一个点,考虑当前圆是否包含了这个点,如果没有,则把圆变成以这个点为圆心,半径为0的圆. 2.枚举第二个点,考虑圆是否包含了这个点,如果没有,则把圆变成以这两个点 ...

  8. python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型

    1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...

  9. python--区分函数和方法, 反射

    1.  isinstance,   type,   issubclass isinstance(): 判断你给的xxx对象是否是xxxxx类型的,只支持向上判断 isinstance(object, ...

  10. BZOJ3210: 花神的浇花集会(坐标系变换)

    题面 传送门 题解 坐标系变换把切比雪夫距离转化为曼哈顿距离 那么对于所有的\(x\)坐标中,肯定是中位数最优了,\(y\)坐标同理 然而有可能这个新的点不合法,也就是说不存在\((x+y,x-y)\ ...