`

随笔知识

阅读更多
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

    此阶段的教育目标不仅仅是传授知识,更重要的是引导学生们建立正确的世界观和法治观。对于这些刚刚踏进校园的小学生来说,形成良好的行为习惯和法律意识,对他们一生的成长至关重要。 当前,二年级的道德与法治教学...

    2019_2020学年高中语文第三单元杂文随笔学业水平检测题含解析新人教版必修4

    通过这种形式的考试,学生不仅能够巩固对杂文随笔知识的理解,还能够提升自己对社会和历史现象的洞察力,加强对传统文化的认同感。同时,教师也可以根据学生的答题情况,进一步调整教学策略,帮助学生更好地吸收和...

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

    教师随笔-小班教师政治随笔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"是一种常见的文件压缩格式...

    人生随笔.doc

    然而,真正的价值并非仅停留在知识本身,正如《人生随笔.doc》所强调的那样,知识的价值更体现在行动中。才华不是空谈,更不是自我标榜,而是需要通过实际的行动来证明。我们应当勇于承担责任,用成果来展现自己的...

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

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

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

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

    心情日记随笔300字.doc

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

    生活感言随笔.docx

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

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

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

    一年级语文教学随笔.pdf

    这篇教学随笔主要探讨了以下几个方面: 首先,教师需要认识到一年级学生的特点,他们活泼好动,注意力维持时间较短。因此,创设有趣、富有吸引力的教学情境至关重要。例如,通过设立小奖励,如小红旗、小红花等,...

Global site tag (gtag.js) - Google Analytics