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编码转换为对应的字符
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编码转换为对应的字符
发表评论
-
ruby面试
2020-05-10 09:24 366Block、Proc 与 Lambda的区别: https: ... -
rails console 记录命令历史
2020-03-20 10:53 3501: 打开文件: vim ~/.irbrc,添加如下内容: ... -
mysql dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
2019-12-16 16:43 435今天一连串的神操作导致连接mysql一直报错,dyld: Li ... -
ruby gsub和sub 的特殊使用
2019-04-04 19:53 1040gsub和sub使用 常用的使 ... -
rails离线环境搭建相关命令
2018-12-17 09:35 4501:下载yum包: 环境搭建需要安装很多包,可以使用 yumd ... -
rails离线环境搭建相关命令
2018-12-17 09:35 4771:下载yum包: 环境搭建需要安装很多包,可以使用 yumd ... -
rails5 belongs_to 默认不能为空,报错must exist
2017-04-29 16:37 4831: 在config/application.rb设置 con ... -
rails 中 group 按照一定的规则返回数据
2012-11-03 19:20 970has_many :user_resumes, class_n ... -
项目 经验
2012-10-10 15:53 01: user = User.first; user. ... -
数组使用will_paginate
2012-03-30 11:58 1436有的时候,在开发的过程中需要对模型数组进行分页,此时我们可以如 ... -
我的rails 编程规范
2012-01-16 15:19 8961: 属性中时间要已at结尾,例如created_at, ... -
html_safe
2012-01-12 13:56 1432html_safe: 可以保证(> < &am ... -
同时分页查找没有关联关系的多个表
2011-12-30 14:41 1291supplyinfos和seekinginfos两个表 需求: ... -
send_file ie下文件名乱码问题解决
2011-10-28 17:50 2475使用rails的send_file 实现下载功能时,type指 ... -
counter_cache的使用
2011-10-08 11:55 2732有点惭愧,做rails也2年了,竟然不会用co ... -
has_many 关联关系表单 提交
2011-04-18 17:16 1155class Author has_many :books ... -
belongs_to 多级关联关系
2011-04-12 14:18 1129有一种情况,是这样的c属于b,b属于a,但是我们有时候想建立c ... -
rails 根据异常显示特定的错误页面
2011-03-27 20:50 1177rescue_from 异常, :with => :a ... -
rails 笔记
2011-03-27 20:49 1743启动项目: ruby script/se ... -
rails 发送电子邮件(ActionMailer)
2011-03-27 20:49 36361: 复制以下配置邮件 ...
相关推荐
因此,教师需要在活动前做好充分的准备,引导学生认真参与,使他们在轻松愉快的氛围中学习法律知识并进行自我反思。 道德与法治教育不仅限于课堂,更要渗透到学生的日常生活中。教师应教育学生遵守《小学生日常行为...
【幼儿园老师训练随笔知识点】 1. **儿童社交技能培养**:通过描述中佳佳与瑶瑶的冲突,我们可以看出幼儿园阶段的孩子正在学习如何处理人际矛盾。教师在此扮演了调解者的角色,教育孩子们要学会原谅和理解他人,这...
【幼儿园教师教育随笔知识点】 1. **平等与尊重**:教师应将幼儿视为朋友,以平等融洽的关系与他们交流。蹲下来与孩子交谈,不仅体现身体上的亲近,更表明心理上的理解和接纳,有助于建立良好的师幼互动。 2. **...
### 图解HTTP随笔知识点详解 #### 一、概述 本文档是对《图解HTTP》一书中的知识点进行深入解析的补充文档。原文档可参考链接:https://blog.csdn.net/qq_38746380/article/details/102688140。本篇补充文档旨在...
### Lotus Notes程序设计随笔知识点解析 #### 一、Lotus Notes简介与学习起点 **Lotus Notes**是一款由IBM开发的企业级协作平台,它集成了邮件服务、文档管理、数据库应用等多种功能于一体,在企业级协作软件领域...
### Hibernate学习随笔知识点梳理 #### 一、Hibernate简介与基本概念 - **Hibernate**:是一种Java语言下的对象关系映射(ORM)框架,它能够将面向对象模型的数据存储到关系型数据库中,并且可以自动处理数据的...
很抱歉,但根据您给出的信息,标题和描述中提到的是"网恋随笔散文随笔散文.rar",这明显与IT行业知识不相符,而更倾向于文学或个人创作。标签虽为"教育",但没有具体的IT教育相关知识点。压缩包子文件的文件名称列表...
【标题解析】 "散文随笔【黄牛散文随笔】.rar" 是一个压缩文件,...综上所述,"散文随笔【黄牛散文随笔】.rar"是一个集文学、教育于一体的资源,读者可以通过解压阅读,领略黄牛的文学魅力,同时从中汲取知识和灵感。
IT知识需要有明确的、有意义的上下文内容作为基础,例如具体的编程语言、软件技术、网络安全、操作系统、IT管理知识、云计算、大数据、人工智能等。 如果可以,请提供具体的、有意义的文本内容,我将根据所给的文本...
在IT行业中,尤其是在前端开发领域,常常会...以上就是从工作随笔中提取出的一些关键知识点,涵盖了前端开发中的样式设计、事件处理、数据转换以及组件定位等多个方面,这些知识对于提升开发效率和用户体验都至关重要。
如果文件“时间变成河随笔.pdf”是关于时间管理或生活哲学的随笔,以下可能是它所涉及的知识点: 1. 时间管理的艺术:随笔可能会讨论如何高效地管理个人时间,包括优先级设置、任务划分以及如何避免时间浪费。作者...
根据给定文件的信息,我们可以提炼出以下几个主要的知识点: ### 1. 幼儿教育的重要性 - **基础知识**:从婴幼儿出生到成长的过程是不断进步发展的。幼儿园阶段是这一过程中的重要环节,它不仅关系到孩子们的身体...
以下是一些可能涵盖的重要知识点: 1. **Java基础**:这部分可能包括了Java的基本语法,如变量、数据类型、运算符、流程控制(if语句、for循环、while循环)、方法定义和调用等。 2. **面向对象编程**:Java的核心...
【详细知识点】 1. **RAR文件格式**:RAR是一种常见的压缩文件格式,用于减少文件大小以便存储和传输。它支持分卷压缩,可以在多个文件中存储一个大型文件。 2. **PDF文件格式**:PDF(Portable Document Format)...
【标题】"散文随笔_生活三部曲散文随笔.rar"所指的是一份包含散文随笔作品的压缩文件,特别关注的是生活的主题。在IT领域,这可能涉及到电子书、数字出版或个人资料存储等方面的知识。"rar"是一种常见的文件压缩格式...
这篇《小学三年级语文教学反思随笔》提到的教学理念与方法,对于提高教学质量具有深远的指导意义。 首先,教学应当注重“活”。这里的“活”是指教学方法的灵活性和生动性。教师不能拘泥于教材和教参,而是应该运用...
很抱歉,根据您提供的信息,标题和描述似乎与IT行业知识并不相关,它们更像是文学作品或者个人随笔的名称。不过,既然您提到了“标签”是“教育”,我可以假设这里可能是指一篇关于教育理念或者情感教育的随笔。然而...
知识点: 1. 随笔作文的写作技巧:随笔作文需要作者有强的语言能力和写作技巧,能够生动地描绘场景和情感。 2. 文学作品的分析:文学作品需要有深入的分析和解读,展现了作者的思想和情感。 3. 家庭和亲情:家庭和...
很抱歉,根据您提供的文件信息,标题和描述中提到的“生活感言随笔.docx”显然是一份关于个人感悟和生活体验的文档,并非与技术相关的内容。标签虽然注明为“技术”,但从部分内容来看,主要讲述的是作者对于日常...
教育随笔的内容可能涵盖了以下几个关键知识点: 1. **教育理念**:作者可能会探讨如何实施以儿童为中心的教育,强调尊重孩子的天性,鼓励他们在玩耍和笑声中学习。这涉及到对蒙特梭利教育法、瑞吉欧教育体系等先进...