Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Branch: master
Fetching contributors…

Cannot retrieve contributors at this time

executable file 95 lines (75 sloc) 5.517 kB
字符串是日期标准字符串格式,rails在持久化时会自动将字符串转为日期格式
如:plan 是一个model实例,start_off_date是其一个字段数据类型为date
plan.start_off_date = "2011-5-28"
plan.save
puts plan.start_off_date #Fri, 28 May 2011
安装gem包之后需要重启web服务器(更改过加载路径的都需要重启web服务器)
使用render_to_string 时,需要指定渲染的是 templete 还是 partial,默认为 templete
eg: render_to_string :partial => 'xxxx.html', :locals => {:xx => @xx}
如果是JSON访问方式,那么partial是 .html.erb时就需要制定格式,因为默认希望得到JS文件
通过 :locals => {:xx => @xx} 来传输 实例变量;注:locals只能传送instance变量.
p=Plan.first
old_name = p.name
new_name = old_name.to_s << "tjc"
p.update_attribute(:name, new_name)
原因:用=号赋值new_name 与 old_name 指向同一个引用,<< 操作符不改变object_id意思是new_name与old_name任然为同一个引用.故为modified in-place.
If an attribute is modified in-place then make use of [attribute_name]_will_change! to mark that the attribute is changing.
Otherwise ActiveModel can't track changes to in-place attributes.
为什么在有些时候在controller里用help_method定义 helper method?
1.纯helper方法(放在helper目录中的)主要是处理view的格式和templete逻辑.
2.当controller和view都要用到helper的时候最好使用helper_method,一个很好的例子就是current_user.
3.如果方法更多的是在处理controller逻辑而不是格式化view那么它应该放在controller里面。比如:current_user在所有controller共享所以它定义在ApplicationController.
方法放置位置:将方法放在其使用的数据所在对象里面
字符编码-web页面,编辑器,数据库,linux终端必须一致。
遭遇:由于linux终端编码为unicode(UTF-8)导致乱码。
rails中escape_javascript的作用:将特殊符号转意,如:转换字符串的换行符为\n,把单双引号前面加\等等...
for example:
$('#xx').html("<%= str %>"); 这里的str如果含有'或"等特殊字符时,那么字符串就被截断了。所以需要escape_javascript
注意:escape_javascript 参数只能为String
因为rails现在是threadsafe的--即每个新的request都会创建一个独立的environment hash 多线程并发完全交由rails框架来处理;
因为rails本身对C写的扩展的支持不是很好,在并发时遇到C操作的线程会一直阻塞直到C扩展线程处理完毕才能进行下一个处理,所以才放弃使用mysql的C扩展而去写了mysql的gem包
===============================================================================================================
IMPORTANT: In order for inheritance to work for the callback queues, you must specify the callbacks before specifying the associations. Otherwise, you might trigger the loading of a child before the parent has registered the callbacks and they won’t be inherited.
===============================================================================================================
a = 1,
b = 2
会导致 a = [1,2]
to_json的效果
在congroller里如果是直接对render返回的中文字符串调用to_json客户端会显示16进制编码(英文正常)
如果是装入到hash中对其调用to_json 显示效果与不调用一样。
user = User.first
此时通过其他model对User.first进行更改之后user数据变成老数据
这时记得user.reload
=========Important============
ActiveRecord::Base.transcation do
end
在transcation里面如果抛出网络超时异常不会促发rollback,
=========Important============
About transcations:
1.A transaction acts on a single database connection.
===========================rails model 关系使用不当导致错误更新association的字段==========================
class Alliance < ActiveRecord::Base
has_many :alliance_memberships, :dependent => :destroy
has_many :users, :through => :alliance_memberships
has_many :alliance_applications, :dependent => :destroy
end
class User < ActiveRecord::Base
has_one :alliance_membership, :dependent => :destroy
has_one :alliance_application, :dependent => :destroy
has_one :alliance, :through => :alliance_membership
end
===========================rails model 关系使用不当导致错误更新association的字段==========================
user = User.first
user.alliance
user.update_attributes! :user_name => 'mafei'
update_attributes 的API说明:
# The following transaction covers any possible database side-effects of the
# attributes assignment. For example, setting the IDs of a child collection.
他会更新所有的association, 又因为alliance 里面错误的定义了user_id字段误导了rails,所以在更新user的时候rails
会更新alliance里面的user_id字段。(PS:如果在update_attributes之前不调用user.alliance rails不会更新alliance,因为他认为alliance没有变)
=========================undefined method `target' for []:ActiveRecord::Relation)========================
如果一个model申明了has_many 关系 当申明的这个集合没有 model的外键时,且update_attributes前调用过集合,update_attributes会出现以上错误
eg: user has_many notes
user.notes
user.update_attributes :xxx=>xxx
因为update_attributes会给child collection赋值,在这里user找notes时由于notes没有user_id外键所以会报undefined method target错误
Jump to Line
Something went wrong with that request. Please try again.