ruby on rails

rails问题总结

2017-03-10  本文已影响0人  五月的约修亚
  1. 使用ajax异步提交表单
    在rails中只能使用type=submit的button来提交有data-remote=true属性的ajax的表单。如果使用type=button的按钮提交表单则只能通过js(document.formname.submit())提交,此时会变成同步提交而非ajax。

  2. escape_javascriptsimple_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 %>来进行安全的转换

  3. string转换成时间戳

require 'time'
timestamp = Time.parse("2011-05-19 10:30:14").to_i
  1. flash
    rails中的flash和flash.now可以保存一次请求过程的内容
    flash[:notice]的内容可以保持到下一次的action
    flash.now[:notice]的内容只用于当次渲染view

  2. protect_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并在后端验证,非常方便

  1. 关于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

  2. 局部视图出现两次的问题
    rails中使用render进行局部视图渲染时,如果渲染的内容在页面中出现两次,则有可能是.js.erb文件中选择的元素不对:

    $("#case_table_body").html("<%= escape_javascript(render :partial => 'cases_table')%>”)
    case_table_body应该是主页面中的元素

  3. 在ajax请求中重定向到其他页面

    render :js => "window.location = '/jobs/index'"
  1. 在form中如果有type=file的input的话data-remote=true就不会生效了,可以使用remotipart这个gem来解决

  2. 使用tab切换显示内容时前后端传递params[:tab]比较难以控制,可以使用jQuery在点击事件中修改tab的active状态

  3. 使用<%= simple_format(@data) %>来转换后端传到前端的数据
    (http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format)
    simple_format根据一些规则将后端的字符串转换成前端的HTML。多个\n被认为是一个新段落,被包在<p>标签中。一个\n被认为是一个新行,被转换成<br/>

  1. 关于html_saferawsanitizeh()www.jianshu.com/p/ZLpFSy
  2. 当打印日志出现问题时(log writing failed. "\xE6" from ASCII-8BIT to UTF)可以将log内容强制转码成utf-8进行打印
custom_logger.info "resp: #{resp.force_encoding('UTF-8')}" 
上一篇 下一篇

猜你喜欢

热点阅读