`

随笔知识

阅读更多
show-source: 查看方法在文件中的位置,show-source User.first

ruby-oci8报错: https://www.jianshu.com/p/527a14f29967
printf "%20s", "哈哈哈哈哈哈" 打印长度为20的字符串
each_child 遍历目录,排除.和..

saved_changes  保存变化
saved_changes?  保存是否有变化


当我们要监控继承操作的时候,就可以使用inherited,这里的inherited是钩子方法,类似的还有included、extended、prepended、method_added
class User
  def self.inherited(subclass)
    puts "#{self} 是 #{subclass}的父类"
  end
end

class User2 < User
  def a
    puts "a"
  end
end
User2.new.a


eval用法:irb的本质就是eval执行,此外erb文件的ruby代码,也是eval执行的。

class User
  10.times.each do |i|
    eval <<-start_eval
      def a#{i}
        puts #{i}
      end
    start_eval
  end
end

User.new.a2

在这里instance_eval也可以这样用


类变量:
class C
  @a = 1
  def m1
    @a
  end

  def self.m2
    @a
  end
end


obj = C.new
puts obj.m1
puts C.m2

如上实例,类里定义@a,这里@a属于类的self,所以其实是类变量,所以第一个输出的是nil,第二个是1。

这里还要注意类C其实也是一个对象,是Class的实例对象,所以可以改写为如下:
c = Class.new(Object) do
  @a = 1
  def m1
    @a
  end

  def self.m2
    @a
  end
end

puts c.new.m1
puts c.m2




@@a = 1
class C
@@a = 2
end
puts @@a
结果是2,因为@@a是属于Object类,而Object类也是C的祖先类,所以这里输出的是2

块不是对象,如果想把块存起来以后执行,或者传递给其他方法和代码块的时候,就需要使用Proc和lambda,但是要注意使用&来把proc转换为块。

第一个示例:
inc = Proc.new{|x| x+1}
puts inc.call(2)

dec = lambda{|x| x+1}
puts dec.call(2)

第二个示例:
def my_method(&a)
  a
end

x = my_method do |name|
  "name is #{name}"
end

puts x.call("zcy")

传递块示例:
def math(a, b)
  yield(a, b)
end

def do_math(a, b, &x)
  math(2, 3, &x)
end

do_math(2, 3) do |a, b|
  puts a * b
end



共享作用域: 在一组方法之间共享一个变量,但是又不希望其他方法访问这个变量,可以通过define_method来实现。

def start_operation
  shared = 0
  Kernel.send :define_method, :get_shared do
    shared
  end

  Kernel.send :define_method, :add_shared do |x|
    shared += x
  end
end

start_operation
puts get_shared
add_shared(4)
puts get_shared


shared = 0
myClass = Class.new do
  Kernel.send :define_method, :counter do
    shared
  end

  Kernel.send :define_method, :inc do |x|
    shared += x
  end
end

myClass.new.counter
puts counter
myClass.new.inc(10)
puts counter



yield: 块,block_given?表示方法是否包含块?

class Digital

  def self.sum(a, b)
    return yield(a, b) if block_given?
    a + b
  end

end

puts Digital.sum(1, 2)



method_missing: 方法不存在时就会调用method_missing,我们可以用该方法自定义方法不存在的提示信息,也可以通过该方法搭配send动态定义方法,这里注意method_missing要慎用,可以优先考虑define_method。

Benchmark: ruby的性能测试库,https://cloud.tencent.com/developer/chapter/16409

refine: 当我们需要扩充ruby中类型的方法,例如为字符串增加一个方法,如果直接定义,会成为全局的方法,而我们只希望某些地方用到的时候使用一下,这时我们就使用到了refine 和 using。

定义一个模块:使用refine为字符串增加一个方法
module StringExtensions
  refine String do
    def name
      puts "zcy"
    end
  end
end

需要用的时候 using StringExtensions,然后就可以"abc".name了


计算内存:
require "objspace"

def a
puts 1
end

ObjectSpace.memsize_of RubyVM::InstructionSequence.of(method(:a))


导出数据到csv,如果数据里有逗号和回车,会影响到文件数据的处理,此时要用引号引起来,如 "\"ha, ha\n ni hao\""

base64字符串超过一定长度会出现换行,js中通过rails的<%= %> 调用时base64代码一定要加上escape_javascript为其转义单引号和双引号以及回车,此外base64 解码中文后不再是utf-8,需要强制转换为utf-8,force_encoding("utf-8")

ruby字符串的加了转义字符,\n就是换行,\t就是tab,\nnn就是8进制的数字 ,\xnnn就是16禁止的数字,如 "\101"就是 65,就是字符串A。"\x41"也是65,也就是字符串A,转义字符只能用双引号,单引号不转义


rails里的to_json为了防止xss,默认开启html转义,例如{a: "<html>"}.to_json的结果是"{\"a\":\"\\u003chtml\\u003e\"}",而ruby的to_json不会这样,rails可以通过config.active_support.escape_html_entities_in_json = false 来修改默认设置。

Kill -9 杀死sidekiq,sidekiq的任务中断后会消失,而kill 任务,sidekiq任务会回到队列。

ruby任务中包含linux脚本任务时,如果kill -9 任务,那么ruby程序接收不到脚本任务返回的异常,正常kill是可以收到的

使用newrelic 的 /newrelic功能: 本地查看newrelic,需要注意两点: 1) developer_mode: true  2)  newrelic版本是 4.0.0.332

config.eager_load: 启动预加载,这样启动慢,但是运行快,生产环境默认true

rails console 退出再进入 不记录上一次的历史记录:
https://stackoverflow.com/questions/10465251/can-i-get-the-ruby-on-rails-console-to-remember-my-command-history-umm-better

ps aux | grep ruby  | grep -v grep | wc | awk '{print $1}'
1) grep -v  排除
2) wc   统计结果
3) awk 输出返回数据的值  $1是第一个


pgrep masscan | sudo xargs kill -9:  pgrep 相当于ps aux | grep ...,并且直接返回pid

pstack pid:  查看该进程的详细信息

chomp、chomp!   移除最后面的一段字符串  "zhang".chmop("g")

移动端 点击时间有300毫秒延迟,fastclick插件可以处理这个问题

rails 公网访问服务器: bundle exec rails server -p 8080 -b 0.0.0.0

ie7和ie8不支持indexOf方法:如下可以解决

  if (!Array.prototype.indexOf){
    Array.prototype.indexOf = function(value, from){
    var len = this.length >>> 0;
    // 索引必须为整数,忽略小数尾数
    var from = parseInt(from) || 0;
    // 当索引小于0时,加上一次数组长度
    from = from < 0 ? from + len : from;
    for (; from < len; from++){
      if (from in this && this[from] === value)
        return from;
      }
      return -1;
    };
  }



js方法打开页面默认调用一次,可以加括号,如下

(function longPolling() {
    alert(1)
})();


SecureRandom.hex 随机字符串

after_commit  after_create_commit  after_update_commit:   不会把回调包含到事物中,回调失败不影响执行,而after_save会影响,回调失败,执行失败

跳转链接无法直接trigger("click")跳转,需要 $("link").get(0).click()

tiny_tds安装不上: https://stackoverflow.com/questions/23593086/rails-4-error-when-installing-tiny-tds-gem、https://github.com/rails-sqlserver/tiny_tds#install

var date1 = new Date(2000, 0, 1,1,1,1); var date2 = new Date(2000, 0, 1,1,1,1), date1 == date2 和 date1 != date2, 这两种是不能比较的,date对象是引用对象,应该改为 date1.getTime() == date2.getTime()

rails中where为条件,where.not为相反条件。 User.where.not(id: 2)为id不等于2的用户

javascript: 函数中传入的参数是函数,这个函数的执行只需要加一个括号()

javascript中数组splice方法: 两个参数时代表删除,多个参数时代表前两个数依然是删除、后面的参数是插入的数据 a=["a", "b", "c"]; a.splice(1,2); a=>["a"];

preventDefault: 阻止事件发生
stopPropagation: 阻止事件传递到父元素,A元素包含B元素,都绑定时间click,clickB元素,也会触发A元素的click事件,如果B元素调用了stopPropagation就会阻止A元素的click事件,例如 http://www.runoob.com/try/try.php?filename=tryjquery_event_stoppropagation

生成url参数时可以使用URI.encode_www_form(options)代替options.collect{|key, value| "#{key}=#{value}"}.join("&")这样会自动转义

product_order 和 order_line_item为1对多关系,直接保存product_order和order_line_items时,国际化文件中如下配置:

product_order/order_line_items:
  quantity: 商品库存


rails5 asset相关知识
path1 = "#{Rails.root}/app/assets/_sites/stylesheet1"
path2 = "#{Rails.root}/app/assets/_sites/stylesheet2"
Rails.application.config.assets.paths << path1
Rails.application.config.assets.paths << path2

window.location.reload(true)  相当于把鼠标放到地址栏回车,默认是刷新。

1: Rails.application.config.assets.precompile += %w(custom/admin/admin.css)
Rails.application.config.assets.paths 的path1 优先于 path2,  当我们调用 stylesheet_link_tag 'custom/admin/admin'时,如果这个两个path1和path2 中都有'custom/admin/admin',那么由于path1在前面,此时返回的路径是  /assets/stylesheet1/custom/admin/admin.css,如果要强制调用path2下的'custom/admin/admin',那么 stylesheet_link_tag 'stylesheet2/custom/admin/admin'会返回 /assets/stylesheet2/custom/admin/admin.css


2:  第一种方式调用的时候容易照成问题,我们可以直接预编译的时候把路径写进去,调用的时候也用绝对路径

Rails.application.config.assets.precompile += %w(stylesheet1/custom/admin/admin.css)
Rails.application.config.assets.precompile += %w(stylesheet2/custom/admin/admin.css)

调用的时候直接

stylesheet_link_tag 'stylesheet1/custom/admin/admin'
stylesheet_link_tag 'stylesheet2/custom/admin/admin'

使用环境变量: RAILS_ENV=development 。。。。。, 这样可以使用rails_env = ENV['RAILS_ENV']

alias_method_chain:  有的时候我们会想在原方法的基础上修改该方法,此时就用到了alias_method_chain,例如

  def m1
    puts "m1"
  end

  def m1_with_m2
    puts "do something befor m1"
    m1_without_m2
    puts "do something after m2"
  end

  alias_method_chain :m1, :m2

  此时调用m1,显示的其实是m1_with_m2.



open -a "Sublime Text" 打开sublime text 应用程序
references: rails generate message content:text user:references 中 references会生成user_id作为message对应user的外键


render(view, locals, buffer=nil, &block) eg: <%= render 'form', a: "a" %>
render(options = {}, locals = {}, &block) eg: <%= render partial: 'form', a: "a" %>
render 数组实例变量  eg: render @messages, @messages.count个render "message", message: 消息对象,   render partial: "messages/message", collection: @user.messages  简写为 render @user.messages


本地安全策略: 在windows系统中,如果由于某些原因不允许系统连接某个ip,可以在本地安全策略中设置。(控制面板 -> 管理工具 -> 本地安全策略)

常用dns服务器: 202.106.0.20   202.96.199.133

ruby邮件默认url设置: config/application.rb 中设置 config.action_mailer.default_url_options = {host: 'example.com'},这样邮件页面中home_url或者url_for这些方法中不需要制定host参数了。

squish:  该方法去掉字符串开头和结尾的空格,并且将所有的多个空格、\r、\n、\t替换为一个空格。

with_lock:  rails使用锁

1):
Item.transaction do
  i = Item.lock.first
  i.name = 'Jones'
  i.save
end

2):
item = Item.first
item.with_lock do
  # This block is called within a transaction,
  # item is already locked.
  item.increment!(:views)
end


使用git视图工具查看页面日志: gitk 文件路径


无法抓取数据: 有的时候用mechanize抓取数据会无法显示完整,那么可以用hpricot来结合使用


本地搭建代理:  ssh -R 49393.com:8082:localhost:8081 root@ziyuan.web

服务器:  /etc/ssh/sshd_config 添加 GatewayPorts yes,重启



<span id="ceshi" data-user_id = "用户id">   $("#ceshi").data("user_id")



mongoid:  mongo类里更新数据时,发现如果该数据值和之前一样,那么更新时间不变,如果需要触发更新时间,可以touch。

ruby随机字符串: SecureRandom.hex(32)

kill -USR2 旧nginx主进程号:此时会在不关闭老进程的情况下启动一个新的nginx进程

warning: toplevel constant Image referenced by Sitetemp::Image 遇到这种错误可以通过require 该文件解决这个问题。require File.expand_path('../../image.rb',__FILE__)

include 和 extend 的区别:  extend 将module的实例方法作为类方法导入,而include 将module中的 实例方法作为实例方法导入

block 和 lambda  和 Proc的区别:  block是块,作为参数只能传入一个,并且放到最后,而Proc和lambda是对象可以传入多个,Proc中的return返回时,会把包含该proc对象的函数也返回,而lambda中的return 不会这样,只会返回该lambda,而后面的程序继续执行,同理break也是这样的,在Proc中的break无法使用, lambda中的break 智慧中断lambda

javascript 查看类型 用 typeof,例如 typeof("wode")

mysql 设置远程连接:
/etc/mysql/my.cnf 注释 #bind-address = 127.0.0.1
insert into mysql.user(Host,User,Password) values('登录IP','用户名称',password('用户密码'));
flush privileges;
grant all privileges on *.* to 用户名称@'登录IP' identified by "用户密码";



执行html中的js:异步加载的时候可以用到这个

function exec_js(html){

var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
var jsContained = html.match(regDetectJs);

// 第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {
// 分段取出js正则
var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;

// 按顺序分段执行js
var jsNums = jsContained.length;
for (var i=0; i<jsNums; i++) {
var jsSection = jsContained[i].match(regGetJS);

if(jsSection[2]) {
if(window.execScript) {
// 给IE的特殊待遇
window.execScript(jsSection[2]);
} else {
// 给其他大部分浏览器用的
window.eval(jsSection[2]);
}
}
}
}
}



CGI::Parse  可以将字符串转地址化为为hash参数

float 类型的数据操作有bug,例如: 629.3* 100 = 62929.99999999999, 改为: BigDecimal('629.3') * 100

UserTeam.where("user_id != ?", 3)  它实际是返回user_id不等于3和null的数据

jbuilder 创建数组hash:   {and: [term: {isDefault: true}]}

json.and do
json.child! do
json.term do
json.isDefault true
end
end

end

[1,2,3].sample(2) :  随机返回数组中的两个元素

linux目录最多限制创建32767个文件或目录,否则会报错 too many links 

注释 /etc/mysql/my.cnf  文件中 这句话:   bind-address           = 127.0.0.1,telnet  ip 3306 可以连接了,此时还需要修改要修改mysql数据库表中的用户是否需要远程连接,如果需要,那么要进入mysql数据库,修改user表中host字段值为%

jquery.validate.js 验证 隐藏域,添加 ignore: ""可以实现这个目的

methods(false): 跳过继承的方法

carrierwave:  remote_attachment_file_name_url 可以直接加上图片的url来保存,这个的前提是图片url有图片名称

simple_form_for  嵌套    文本域框

<%= f.input :description_cn, resume_wrapper_html: {class: "col-sm-14"} do %>
<%= f.text_area :description_cn, size: "15x7", id: "aaa" %>
<%= render "/shared/text_area_notice", length: 500, notice_id: "aaa", field_id: "aaa" %>
<% end %>



当前获取到焦点的dom,。。。。

$(document).on('focus', ':focus', function(){
console.info($(this).attr("id"))
})



instance_variable_get的使用:   instance_variable_get(:@parent_region_id),直接调用parent_region_id,假如model里有这个方法和这个属性,那么优先是方法,而此时我们想要使用属性,那么我们需要这样调用 instance_variable_get(:@parent_region_id)





Jbuilder写 [{name: "zcy"}, {age: 28}],如下:

json.child! do
  json.name "zcy"
end

json.child! do
  json.age 28
end



bootstrap font-awesome 在firefox 下不支持跨域请求,需要在nginx web服务器中添加 add_header Access-Control-Allow-Origin *;

validates_associated :user  验证关联对象是否有效

model中使用路由path方法,Rails.application.routes.url_helpers.home_path

Bundler.require(:default, Rails.env)  加载所有Gem包

line-height、height 高度相同可以实现垂直居中。

includes的嵌套使用:  recommendations_companies=current_site.recommendations_companies.includes(item: :icon)

tesseract-ocr:  可以解析图片上的数字

刚才在中华英才网上,搬来想抓取网站公司用户的信息,没想到他们的email和电话这样的信息都是一张一张的小图片,佩服。

define_callback和set_callback:  可以自定义方法和回调方法的执行

console下查看routes路由:  app.login_path,控制器中直接打出来就行

time_ago_in_words(时间) :  可以让时间显示为几天前这样的样式

number_to_human_size(1024) :  转换字节为kb 或 M等

在ie下ajax请求会被自动缓存起来,如果第一次请求后,同样的url再第二次请求,那么结果和第一次一样。可以通过$.ajaxSetup({ cache: false });来修改。

cancan:

check_authorization:  验证是否有去验证某些action,这个是为了防止项目因为需要验证的action太多,而导致某些action忘了验证,所以通常在application_controller.rb中添加这个,如果需要跳过这个验证的话,可以skip_authorization_check,真正的验证权限是authorize_resource




get "get_link", constraints: lambda { |request| request.xhr? } 动态限制必须是ajax请求

路由写法: get '/jobs', to: redirect {|params, request| request.url.sub('/companies','/gongsis') }

html.erb 

html.ruby  可以直接写ruby代码

js.erb  可以直接像在erb文件中写代码

rails 中直接写ajax,好处是可以直接使用rails中方法:

页面:

$.ajax({
url: "/jobs/<%=@job.id%>/get_link"
})


controller:

def get_link
@job = Job.find_by!(id: params[:job_id])
end

返回处理:写在 get_link.js.erb文件里



dnsmasq: 支持泛域名解析,http://chenshaoju.blogbus.com/

linux 开机启动:  /etc/rc.local文件种可以设置开机启动执行的名令

nginx 支持跨域woff自定义自体:  http://xiaosong.me/share/let-nginx-support-cross-domain-woff-custom-font

事务注意:  使用事务同时存入多条数据,同时另一条请求去请求这些数据,action里此时没有全部存入,所以是空的,但是当执行过滤器的时候,它存入了,这个时候就执行了过滤器。

render json 页面的时候 <% .... %>中一定要用raw,  {"status": <%= (@import_records.size > 0 ? true : false) %>, "notice": <%= raw @import_records.find_by(is_need_return_complete: false).try(:message).to_json %>, "html": <%=raw render("get_progress.html.erb", import_records: @import_records.to_a.from(1)).to_json %> }

javascript中定义全局变量,可以window.name = '....'

公司后台 logo

e 移动到词尾
b 移动到词首

所有的需要登录的地方ajax弹出登录页面,登录后,跳转回当前页面
qq在线咨询

git切tag: clone了git上的项目后,需要对某个版本下的项目进行修改,可以先切tag,步骤如下:

git tag 查看版本
git checkou 版本号
git co -b 分支
修改内容
push到远程分支下
然后Gemfile中制定分支的gem

accepts_nested_attributes_for :属性 ,这个属性无法验证uniquness


rails 先校验,后回调方法,如果校验不通过,那么是不会调用回调方法的

rails中的i18n配置中,命名空间是 resume/job_target 这样的形式

factory_girl 中创建1对多关联关系 的对象时,可以这样,如下

factory :resume_job_target, class: "Resume::JobTarget" do
association :resume
job_classes {[FactoryGirl.create(:dict_job_class)]}
end


$("form").submit(function(e){
e.preventDefault();
});


ajax 请求json数据,服务器端如果返回中文时,必须to_json,否则返回时,执行error函数

current_page?(url) 判断是否是当前页面


data: {uid:function(){ return jQuery("#<%=txtUid.ClientID %>").val();}}
而使用function的好处就是在页面加载的时候仅仅告诉jQuery.Validate,在控件需要进行remote验证的时候需要调用function这个函数,这样就保证了在执行remote验证的时候可以获取到最新的值


css代码只在firefox下生效
@-moz-document url-prefix() {
.....
}

linux系统中, 命令后加&,可以后台运行,例如 rails server&

firefox 启动多个配置文件(多用户): '/home/zcy/桌面/到 firefox 的链接' --no-remote


date_select 日期倒序排列, start_year: Date.current , end_year: Date.current - 80


修改网上的gem,首先fork,fork后创建分支,在分支上修改,写的时候,在项目中用下列方式指向正在修改的本地gem,这样就方便多了
gem '....', path: "本地路径"


display: inline-block; 我们常常遇到这种需求,就是块元素,但是需要并排显示,这时就可以使用inline-block了

Info.all.size > 0 等同于 Info.all.any?


错误:

<%= yield(:search) if content_for?(:search) %>
<% content_for :search do %>
zhangcaiyan
<% end %>
正确:
<% content_for :search do %>
zhangcaiyan
<% end %>
<%= yield(:search) if content_for?(:search) %>

"resume_target".camelize => "ResumeTarget"
"ResumeTarget".underscore => "resume_taget"
"User".constantize User (类型为User class)
camelize.underscore

git cherry-pick 101ccea merge某个提交模块

过滤html代码 strip_tags(string)

unicorn应用服务器 代替 passenger

<a class="info new"> 获取样式可以这样 $(".info.new")

如果本地有预编译的文件,那么程序先执行预编译的文件

response = Timeout::timeout(10) do
open(url)
end

以下这种写法可以用于图片上的链接
<%= link_to path do %>
name
<%%>

间隔迭代: [1,2,3,4,5].each_slice(3){|a, x| puts a}

before_filter: :a, :b 先检测后面的b,然后才是a

jquery validate 指定了 onkeyup: false, onfocusout: false, onclick: false,在提交表单的时候会导致验证无论是否通过都会提交,这时可以通过提交的时候指定验证属性来解决这个问题, register_validator.element("#register_user_email")

f.select 添加class,注意,因为select加两个hash参数,最后一个才是html相关的参数,所以在class之前要加一个{}
<%= f.select :province_id, options_for_select(form_provinces(@gongqiu).collect{|obj| [obj.name, obj.id]}), {include_blank: "请选择省份"}, class: "region_relation_province_id" %>

erb中的html.erb js.erb json.erb: 分别是对应的rails respond返回的html和js和json的格式,当我们实现一个ajax的编辑表单效果时,可以在json.erb中写好整个的表单,然后再返回该json.erb表单。erb中要注意写json数据,否则无法获取数据,如下:
{ "html": <%=raw render("form.html.erb", experience: @experience, url: resume_experiences_path).to_json %> }

判断element父元素是否存在,可以这样element.parents(".time_range") > 0

在jquery中可能会遇到这种需求,某个元素下的某元素的指定的那个或者最后一个,这样用:last就不行,:last只能获取最后一个,而:last-of-type可以是多个。 $(".form select:last-of-type")

/[^[\u4E00-\u9FA5|\d|\w]]*/ 匹配所有非中文和非英文非数字的字符

[1,2,3].concat(5,6,7) js数组的方法,可以把参数全部添加到数组中。
“a=1&b=2”.split("&") js字符串方法,通过& 间隔,返回数组。

rails_kindeditor 如果按钮是链接,点击链接后,form.submit(),这样文本编辑器的内容无法传递到后台,不过可以通过sync来同步内容后再提交,如下:

<%= f.kindeditor :content, editor_id: 'my_content' %>

$("#save_button").click ->
my_content.sync()
$(".job_form").submit()


text-overflow: ellipsis 超过宽度的内容显示为省略号


ie文档中只有前31个link或style标记关联的CSS能够应用,同理css文件也是只能有31个。
ie中单个的css文件不能超过288kb,超过部分不解析


有的时候,由于某些原因,我们需要在本地启动产品服务器,但是请注意产品服务器不能即时的更新代码,必须重新启动

避免css文件很大,这个其实很容易避免的,在production中有config.assets.precompile += %w( application2.css ),可以制定压缩的文件,我们可以多压缩几个文件,尽量让打开的页面,只加载和它相关的文件就行了

content_for 和 yield, content_for在前面,而yield在后面,否则不会生效,

gem 'font-awesome-sass-rails' 不能放到assets group中,否则有时候会报错

jquery中is 可以判断该对象是否是。。。, 例如 $icon.is(':empty')

使用jquery validate的时候,有时候会遇到ie下报错, SCRIPT5007: 无法获取属性“call”的值: 对象为 null 或未定义 ,这是因为jquery.js和jquery.validate.js的版本是关联的,例如 jquery 1.8.3 和 jquery.validate.js 1.10.0, 而 jquery 1.9.0和 jquery.validate.js 1.11.1
jquery.validate 1.11.1下的addMethod相关修改,addMethod中包括有参数和没有参数的方法,其中有参数的方法,在使用的时候,要添加到rules中,例如:
rules: {
"person_info[card_number]": {
verify_shengfenzheng_size: ['#person_info_card_type_id', '身份证']
}
}

如果没有参数,那么直接在class中添加 名称,注意由于没有参数,所以不要添加[],这里和上个版本是不一样的。

ajax 上传文件要注意,在ie下不生效,ie下必须用frame的方式上传,这里注意返回的必须是字符串,例如 render inline: {a: 1}.to_json

创建用户后,su 用户,终端显示有问题,tab失效等,此时需要修改 sudo vim /etc/passwd,修改用户后的/bin/sh为/bin/bash

创建日期索引时要注意, 日期要是转换为当前的日期,也就是created_at.to_date

js和css太大,导致访问很慢
1: 我们可以压缩css和js
2: 前端缓存
3: nginx压缩,如下
gzip on;
gzip_min_length 1024;
gzip_types text/plain text/css text/html application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;

ctrl+F5: 强制刷新,重新加载文件(避免加载缓存)

ssh连接服务器,自动断掉: 打开服务器 /etc/ssh/sshd_config,我在最后增加一行, ClientAliveInterval 60


will_paginate 对数组进行分页, @follows = current_user.follows_by_type("Job").sort{|a, b| b.created_at <=> a.created_at}.paginate(page: params[:page], per_page: 15), sort是进行排序,需要注意的是,要写在paginate前面,此外需要require 'will_paginate/array'

elasticsearch 中 facets,返回的统计数据,最后几条总是错的,我们可以设置shard为1,或者多查几条数据。

ie下url中直接写中会报错 invalid byte sequence in UTF-8, 但是通常我们遇不到这个问题,因为rails自带的。。path这样的方法会自动转换,但是如果直接写url的时候,就要注意了,用URI.encode转换,例如: URI.encode(jobs_path+"?"+job_searcher.url)

测试nginx配置是否正确 sudo /opt/programs/nginx-1.4.1/sbin/nginx -t

@cert = @certs.new(params[:cert]),当params[:cert]中有附件时,会触发验证,但是这个验证不影响保存,只有save的时候触发的验证才会影响保存。

hash中的slice方法是,只获取该hash中制定参数的键的值 {a: 1, b: 2, c: 3}.slice(:a, :b) => {a: 1, b: 2}

cancan中的check_authorization : 怕有些action忘了验证,所以添加这个,但是否验证通过是由authorize_resource来确定的

cancan中添加参数(条件): can :read, Blog, user_id: 2 只有 authorize! :read, @blog才会验证这个,authorize_resource是无法验证这个的

有时候,为了加快页面载入速度,也许你会把javascript引用放在template的底部,rails_kindeditor提供了一个参数可以确保正常加载:<%= f.kindeditor :content, :window_onload => true %>

email中使用url时,。。path,这个不会自带网址的host部分,所以要用url,例如jobs_url

邮件页面中无法使用helper方法,我们可以在该邮件的 ActionMailer::Base中 add_template_helper helper文件,如下:
class UserMailer < ActionMailer::Base
add_template_helper MailerHelper
end

rvmsudo rails server -p 80: 80端口启动服务器

QQ、sina、人人等开放平台功能的本地开发:

sina: 这个要创建 应用开发,因为直接选择网站开发需要验证服务器,所以我们可以先创建应用,做好功能后,再做上线操作。设置 授权回调页: http://127.0.0.1:3000/回调地址
QQ: 这个无法设置http://127.0.0.1:3000/,所以只能是先正式设置成功,然后,再修改本地host文件,80端口启动服务器(rvmsudo rails server -p 80)来本地开发
人人: 这个和sina类似


动态的添加方法: class_eval、 define_method 、class << 类 (类方法)、实例.方法、 class << 实例、instance_eval

#方法1 动态定义实例方法或类方法
MyClass.class_eval %{
def hi
p "hi,world"
end
}

#方法2(动态) 动态定义实例方法或类方法
MyClass.send(:define_method, :hi2){p 'hi, world'}


class MyClass
end


#方法3, 打开MyClass.singleton_class (eigenclass),类方法
class <<MyClass
def hi3
p "hi,world"
end
end

#方法4,直接定义实例.方法

user = User.first
def user.realname
  ...
end

此时可以调用user.realname

#方法5,实例方法
user = User.first
class << user
  ...
end

#方法6,实例方法

user = User.first
user.instance_eval
  def a
   ...
  end
end
user.a


include Tire::Model::Callbacks 关闭这个就无法即时引用回调,那么数据库数据修改,es索引数据就不会修改了

域名不能用下划线

# 自动加载文件
auto_required_paths = %w(lib)

auto_required_paths.each do |p|
Dir["#{Rails.root}/#{p}/**/*.rb"].each {|f| require_dependency f}
end


自定义方式,find_each接受和find同样的options
Ruby代码 收藏代码

User.find_each(:batch_size => 5000, :start => 2000) do |user|
NewsLetter.weekly_deliver(user)
end


find_in_batches,和find_each相似,但它yield时传递的是model对象数组,而不是单个model对象

Invoice.find_in_batches(:include => :invoice_lines) do |invoices|
export.add_invoices(invoices)
end

bundle outdated 查找过时的gem


find([...]) 和 where("id in (?)", [...]) 区别 find 参数的数组中包含找不到的数据时会报错,而where不会,所以尽量用where

$: 是加载路径,我们加载路径的时候可以配置application.rb, 也可以 $:.unshift(File.dirname(__FILE__)+"/contacts/")

Dir["app/**/*.rb"] 嵌套路径

抓去下拉菜单或者复选框时,对option[selected]的过滤要用last,而不是first,因为有的时候,请选择 这样的选项也是selected状态的,虽然它是未被选择的,例如: education_form_doc.search("select[name='degree'] option[selected]").last.attributes["value"].value

linux下查看当前目录下的文件以及文件夹大小: du -h --max-depth=1, mx-depth 是文件夹下嵌套深度
查看磁盘的使用情况: df

site 和 user 和 site_user: 其中site_user 是site和user的中间关联model,site_user 中验证site_id和user_id不能为空, site = Site.new(user_ids: [....]); site.save;,此时site还未创建,在rails4.0中验证无法通过,所以无法保存,但是在rails4以下是可以的,因为是先创建site后创建site_user

随即字符串: SecureRandom.hex(16)

Mechanize有的时候抓下来的是乱码,那么我们可以如下指定编码:

page = @agent.get person_info_url
page.encoding = "GB18030"
person_info_form = page.form_with name: "BPI_form"

html_escape: 自动转义html字符,这样可以防止html字符被浏览器编译,<%= .... %>中会自动使用html_escape,如果禁止使用,可以使用<%= raw ... %>

capture 可以把一个块赋值给一个变量, 如下:

<% @a = capture do %>
zcy
<%= Time.now %>
<% end %>

富文本框后台录入带图片的内容,前台要注意,图片如果太大,会撑出来。我们前台可以写css,如果图片在p标签内,并且p标签有text-indent,可以写js。
.*** img{
  max-width:100%;
  text-indent:0;
}

或者

.***{
  display: none;
}

$('p img').parents("p").css('text-indent','0em');

rvm 更新最新版本: rvm get stable

carrierwave 重新生成图片: user.avatar.recreate_versions!; user.save

resque后台不显示定时任务:  降低resque-scheduler的版本为 4.0.0

正则中引用匹配出来的数据,可以在正则中使用?<变量名称>,引用的时候可以使用\k<变量名称>,例如  "abc  def".gsub(/(?<var>(abc|def))/, '<span>\k<var></span>'), 最后的结果就是"<span>abc</span>  <span>def</span>"

正则^、$、/A、/Z、/z的区别:

^和$: 不忽略Multiline,把^和$与当作每一行(\n结尾的)的开头和结束来匹配   "zzz\nabc".match(/^abc$/).present? =>  true
\A:  忽略Multiline,把整个字符串作为一个整体,包括\n   "zzz\nabc".match(/\Aabc$/).present? =>  false
\Z: 指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前(忽略   Multiline   选项),"zzz\nabc\n".match(/^abc\Z/).present?  => true  "zzz\nabc\naa".match(/^abc\Z/).present?  => false
\z: 指定匹配必须出现在字符串的结尾(忽略   Multiline   选项),"zzz\nabc\n".match(/^abc\z/).present?  => false

总结: ^和$会以字符串中的\n为分隔符,将字符串分为多个,\A、 \Z、 \z 不会以字符串中的\n为分隔符,将字符串分为多个,而是将整个字符串视为一个。唯一的区别是\Z是出现在字符串的结尾或字符串结尾的 \n 之前,但是\z只能出现在字符串的结尾。

collection_check_boxes: 表单中要保存1对多的数据时这样使用很方便,f.collection_check_boxes :column_ids, Column.all, :id, :name, 该对象和columns是1对多。

unpack('U'): 获取unicode编码数字,返回的是数组,如果要直接返回数字,使用unpack1

pack('U'): 把unicode编码转换为对应的字符


分享到:
评论

相关推荐

    最新二年级道德与法治教学随笔知识.pdf

    因此,教师需要在活动前做好充分的准备,引导学生认真参与,使他们在轻松愉快的氛围中学习法律知识并进行自我反思。 道德与法治教育不仅限于课堂,更要渗透到学生的日常生活中。教师应教育学生遵守《小学生日常行为...

    幼儿园老师训练随笔___模板五篇.docx

    【幼儿园老师训练随笔知识点】 1. **儿童社交技能培养**:通过描述中佳佳与瑶瑶的冲突,我们可以看出幼儿园阶段的孩子正在学习如何处理人际矛盾。教师在此扮演了调解者的角色,教育孩子们要学会原谅和理解他人,这...

    幼儿园教师教育随笔80篇全面版.doc

    【幼儿园教师教育随笔知识点】 1. **平等与尊重**:教师应将幼儿视为朋友,以平等融洽的关系与他们交流。蹲下来与孩子交谈,不仅体现身体上的亲近,更表明心理上的理解和接纳,有助于建立良好的师幼互动。 2. **...

    图解HTTP随笔1.docx

    ### 图解HTTP随笔知识点详解 #### 一、概述 本文档是对《图解HTTP》一书中的知识点进行深入解析的补充文档。原文档可参考链接:https://blog.csdn.net/qq_38746380/article/details/102688140。本篇补充文档旨在...

    Lotus Notes程序设计随笔

    ### Lotus Notes程序设计随笔知识点解析 #### 一、Lotus Notes简介与学习起点 **Lotus Notes**是一款由IBM开发的企业级协作平台,它集成了邮件服务、文档管理、数据库应用等多种功能于一体,在企业级协作软件领域...

    hibernate学习随笔

    ### Hibernate学习随笔知识点梳理 #### 一、Hibernate简介与基本概念 - **Hibernate**:是一种Java语言下的对象关系映射(ORM)框架,它能够将面向对象模型的数据存储到关系型数据库中,并且可以自动处理数据的...

    网恋随笔散文随笔散文.rar

    很抱歉,但根据您给出的信息,标题和描述中提到的是"网恋随笔散文随笔散文.rar",这明显与IT行业知识不相符,而更倾向于文学或个人创作。标签虽为"教育",但没有具体的IT教育相关知识点。压缩包子文件的文件名称列表...

    散文随笔【黄牛散文随笔】.rar

    【标题解析】 "散文随笔【黄牛散文随笔】.rar" 是一个压缩文件,...综上所述,"散文随笔【黄牛散文随笔】.rar"是一个集文学、教育于一体的资源,读者可以通过解压阅读,领略黄牛的文学魅力,同时从中汲取知识和灵感。

    容斋随笔---------------------------.pdf

    IT知识需要有明确的、有意义的上下文内容作为基础,例如具体的编程语言、软件技术、网络安全、操作系统、IT管理知识、云计算、大数据、人工智能等。 如果可以,请提供具体的、有意义的文本内容,我将根据所给的文本...

    工作随笔-记录遇到的知识点

    在IT行业中,尤其是在前端开发领域,常常会...以上就是从工作随笔中提取出的一些关键知识点,涵盖了前端开发中的样式设计、事件处理、数据转换以及组件定位等多个方面,这些知识对于提升开发效率和用户体验都至关重要。

    时间变成河随笔.pdf

    如果文件“时间变成河随笔.pdf”是关于时间管理或生活哲学的随笔,以下可能是它所涉及的知识点: 1. 时间管理的艺术:随笔可能会讨论如何高效地管理个人时间,包括优先级设置、任务划分以及如何避免时间浪费。作者...

    教师随笔-小班教师政治随笔5篇.docx

    根据给定文件的信息,我们可以提炼出以下几个主要的知识点: ### 1. 幼儿教育的重要性 - **基础知识**:从婴幼儿出生到成长的过程是不断进步发展的。幼儿园阶段是这一过程中的重要环节,它不仅关系到孩子们的身体...

    Java完整随笔(学习)

    以下是一些可能涵盖的重要知识点: 1. **Java基础**:这部分可能包括了Java的基本语法,如变量、数据类型、运算符、流程控制(if语句、for循环、while循环)、方法定义和调用等。 2. **面向对象编程**:Java的核心...

    散文随笔【人间五月散文随笔】.rar

    【详细知识点】 1. **RAR文件格式**:RAR是一种常见的压缩文件格式,用于减少文件大小以便存储和传输。它支持分卷压缩,可以在多个文件中存储一个大型文件。 2. **PDF文件格式**:PDF(Portable Document Format)...

    散文随笔_生活三部曲散文随笔.rar

    【标题】"散文随笔_生活三部曲散文随笔.rar"所指的是一份包含散文随笔作品的压缩文件,特别关注的是生活的主题。在IT领域,这可能涉及到电子书、数字出版或个人资料存储等方面的知识。"rar"是一种常见的文件压缩格式...

    小学三年级语文教学反思随笔[小学语文老师随笔我培训反思](20211124223534).pdf

    这篇《小学三年级语文教学反思随笔》提到的教学理念与方法,对于提高教学质量具有深远的指导意义。 首先,教学应当注重“活”。这里的“活”是指教学方法的灵活性和生动性。教师不能拘泥于教材和教参,而是应该运用...

    【爱,因感觉而存在随笔】初冬的感觉随笔.rar

    很抱歉,根据您提供的信息,标题和描述似乎与IT行业知识并不相关,它们更像是文学作品或者个人随笔的名称。不过,既然您提到了“标签”是“教育”,我可以假设这里可能是指一篇关于教育理念或者情感教育的随笔。然而...

    心情日记随笔300字.doc

    知识点: 1. 随笔作文的写作技巧:随笔作文需要作者有强的语言能力和写作技巧,能够生动地描绘场景和情感。 2. 文学作品的分析:文学作品需要有深入的分析和解读,展现了作者的思想和情感。 3. 家庭和亲情:家庭和...

    生活感言随笔.docx

    很抱歉,根据您提供的文件信息,标题和描述中提到的“生活感言随笔.docx”显然是一份关于个人感悟和生活体验的文档,并非与技术相关的内容。标签虽然注明为“技术”,但从部分内容来看,主要讲述的是作者对于日常...

    [在笑声中飞走劳累幼儿园教师教育随笔]教育随笔.rar

    教育随笔的内容可能涵盖了以下几个关键知识点: 1. **教育理念**:作者可能会探讨如何实施以儿童为中心的教育,强调尊重孩子的天性,鼓励他们在玩耍和笑声中学习。这涉及到对蒙特梭利教育法、瑞吉欧教育体系等先进...

Global site tag (gtag.js) - Google Analytics