使用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对多。
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对多。