使用ajax异步提交表单
在rails中只能使用type=submit
的button来提交有data-remote=true
属性的ajax的表单。如果使用type=button
的按钮提交表单则只能通过js(document.formname.submit()
)提交,此时会变成同步提交而非ajax。escape_javascript
和simple_format
2.1 当数据库中的字段有换行符,引号等特殊字符时使用$(input).val("<%= @data %>")
获取数据会导致js语法错误,此时可以使用$(input).val("<%== escape_javascript @data %>”)
来将ruby转换成安全的js
http://stackoverflow.com/questions/18854749/escape-string-ouput-rails-string-in-javascript
2.2 在html中直接显示数据库中的\n等特殊字符时,可以使用<%= simple_format(@data) %></p>或<p><%= @data.html_safe %>
来进行安全的转换string转换成时间戳
require 'time'
timestamp = Time.parse("2011-05-19 10:30:14").to_i
flash
rails中的flash和flash.now可以保存一次请求过程的内容
flash[:notice]
的内容可以保持到下一次的action
flash.now[:notice]
的内容只用于当次渲染viewprotect_from_forgery
从rails 2.0 开始默认开启(protect_from_forgery),目的在于防止CSRF(Cross-Site Request Forgery)攻击。
rails为了保证当前的请求是来自自己的请求,而不是通过其他网站伪造的请求,都会在生成的form 里加入一个隐藏的token值,只有非get请求才会附带token
<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>
当然如果你认为你的action确实不需要验证,那可以这么写:
#除了index,controller里的其他action都需要验证
protect_from_forgery :except => :index
#只有index需要验证
protect_from_forgery :only => :index
只需要在controller中加入protect_from_forgery就可以开启防csrf攻击机制,这会导致在前端提交的form中自动加入token并在后端验证,非常方便
关于params的问题
对于一个界面,第一次渲染时没有params这个参数集合,就是说params[:any]
都是nil;在以后的渲染过程中在表单中为空的参数被当做空字符串传到后端也即params[:not_fill] == ''
如果前端传来的params[:loss_money]=''
而数据库中loss_money为decimal类型,则赋值时case.loss_money = params[:loss_money]
会被转换成null
,解决方式是写为case.loss_money = params[:loss_money].to_f
这样null
会被转化为0.00-
局部视图出现两次的问题
rails中使用render进行局部视图渲染时,如果渲染的内容在页面中出现两次,则有可能是.js.erb文件中选择的元素不对:$("#case_table_body").html("<%= escape_javascript(render :partial => 'cases_table')%>”)
case_table_body应该是主页面中的元素 在ajax请求中重定向到其他页面
render :js => "window.location = '/jobs/index'"
在form中如果有
type=file
的input的话data-remote=true
就不会生效了,可以使用remotipart这个gem来解决使用tab切换显示内容时前后端传递
params[:tab]
比较难以控制,可以使用jQuery在点击事件中修改tab的active状态使用
<%= simple_format(@data) %>
来转换后端传到前端的数据
(http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format)
simple_format
根据一些规则将后端的字符串转换成前端的HTML。多个\n
被认为是一个新段落,被包在<p>
标签中。一个\n
被认为是一个新行,被转换成<br/>
- 关于
html_safe
、raw
、sanitize
和h()
(www.jianshu.com/p/ZLpFSy) - 当打印日志出现问题时(
log writing failed. "\xE6" from ASCII-8BIT to UTF
)可以将log内容强制转码成utf-8进行打印
custom_logger.info "resp: #{resp.force_encoding('UTF-8')}"