随笔知识

使用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对多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值