Rails 学习杂记 二

Rails 代码组织

concerns目录

  1. controller/concerns; models/concerns
    • 放置一些跨controller/model 共享逻辑, 或者独立模块

lib目录

  1. 放置通用业务或者非业务相关的代码

Fat Model

  1. fat Model 文章
    • controller轻量化
    • 把业务逻辑放在model

Rails Environment

  1. Rails 加载和启动
  2. Environments & Rails 应用

Active Support

  1. Active Support 是 Ruby on Rails 的一个组件,扩展了 Ruby 语言,提供了一些实用功能

    # irb
    "".empty? # true
    " ".empty? # false
    
    require 'active_support/all'
    " ".blank? # true
    
  2. rails 默认加载 activesupport gem

  3. Active Support 引用

    • 按需加载
    require 'active_support'
    require 'active_support/core_ext/object/blank'
    
    • Active Support 提供的所有功能
    require 'active_support/all'
    
  4. Active Support 基础扩展

    在 rails 中,下面这些值表示空值 blank?

    • nil & false
    • 只有空白的字符串(判断字符串是否为空使用的是能理解 Unicode 字符的 [:space:],所以 U+2029(分段符)会被视为空白。)
    • 空数组和空散列
    • 其他能响应 empty? 方法,而且返回值为 true 的对象;
    ''.blank? # true
    ' '.blank? # true
    nil.blank? # true
    false.blank? # true
    [].blank? # true
    {}.blank? # true
    

    present? 方法等价于 !blank?

    ''.present? # false
    ' '.blank? # false
    nil.blank? # false
    false.blank? # false
    [].blank? # false
    {}.blank? # false
    

    deep_dup方法深拷贝指定的对象, dup 浅拷贝

    array = ['foo']
    duplicate = array.deep_dup
    duplicate.first.gsub!('str', 'foo')
    
    array     # => ['string']
    duplicate # => ['foo']
    

    try 只想当对象不为 nil 时在其上调用方法,最简单的方式是使用条件语句, try 方法和 Object#send 方法类似,但如果在 nil 上调用,返回值为 nil

    # 不使用 try
    unless @number.nil?
      @number.next
    end
    # 使用 try
    @number.try(:next)
    
    nil.try(:size) # nil
    "hello".try(:length) # 5
    

    to_query

    {c: 3, b: 2, a: 1}.to_query # => "a=1&b=2&c=3"
    

    to_json

    {a: 1, b: 2}.to_json # "{\"a\":1,\"b\":2}"
    
  5. 其他 support

# in? 方法测试某个对象是否在另一个对象中
1.in?([1,2]) # => true
'lo'.in? 'hello' # => true

[1,2].include? 1

# truncate 方法在指定长度处截断接收者, 截断长度包含省略字符串
"Oh dear!".truncate(5) # Oh...
"Oh dear!".truncate(5, omission: '@@@') # "Oh@@@"

# starts_with? 和 ends_with?  是否某个开头或者某个结尾
"foo".starts_with?("f") # => true
"foo".ends_with?("o")   # => true

# pluralize 方法返回接收者的复数形式:使其成为复数
"table".pluralize     # => "tables"
"ruby".pluralize      # => "rubies"
"equipment".pluralize # => "equipment"

# singularize 和 pluralize 相反,
# camelize 方法把接收者变成驼峰式
"admin_user".camelize # => "AdminUser"

# titleize 方法把接收者中的单词首字母变成大写
"fermat's enigma".titleize     # => "Fermat's Enigma"

Action Mailer

  1. 什么是 action mailer
    • 用来发送 email
    • SMTP 协议
    • 像使用 controller/view 一样来发送邮件
  2. 配置
    • SMTP 原理 (simple mailer transfer protocol)
    • 在项目中设置 SMTP 的账户信息
# config/environments/$RAILS_ENV.rb 
# smtp 请求
config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_caching = false
config.action_mailer.smtp_settings = {
   address: ENV['smtp_domain'],
   port: ENV['smtp_port'],
   domain: ENV['smtp_domain'],
   user_name: ENV['smtp_username'],
   password: ENV['smtp_password'],
   authentication: ENV['smtp_authentication'],
   enable_starttls_auto: ENV['smtp_enable_starttls_auto']
}

# .env
export smtp_domain='smtp.qq.com'
export smtp_port='587'
export smtp_authentication='plain'
export smtp_enable_starttls_auto=true

export mailer_sender=''
  1. Email 类型

    • 遵循view 的命名规则, 根据后缀来决定是 Text类型 还是 HTML类型的邮件
    • *.html.erb *.text.erb
  2. 发送Emial

    • UserMailer.welcome_email(@user).deliver_later
  3. 操作代码

    • bin/rails generate mailer UserMailer
    • app/mailers/application_mailer.rb
    class ApplicationMailer < ActionMailer::Base
       default from: 'from@example.com'
       layout 'mailer'
    end
    
    • app/mailers/user_mailer.rb -> 用户注册时填写的电子邮件地址发送一封邮件
    class UserMailer < ApplicationMailer
       def welcome_email(user)
          @user = user
          @url  = 'http://example.com/login'
          mail(to: @user.email, subject: 'Welcome to My Awesome Site')
       end
    end
    
    • view/user_mailer/welcome_email.html.erb 名字和上面保持一致, 写入邮件想写的东西
    • 这一步对应2中的配置
    • 最后一步 发送邮件, 对应4 的操作

异步任务

  1. 资源或时间占用比较多的任务

    • 邮件发送
    • 批量数据处理
    • 数据导出
    • 定时任务
    • etc.
  2. 方案设计

    • Process 进程
    • Thread 线程 (不建议)
  3. 解决方案

    • SideKiq
    • Resque
    • Delayed Job
    • Background Job
    • etc.
  4. Active Job

    • active_job gem
    • 实现统一的异步任务接口
    • 需要结合第三方异步任务组件

Rails 安全

  1. Session & Cookie
    • 不要存一些敏感的东西在其中
  2. User Input
    • CSRF - RESTful/csrf_token 跨站伪造攻击
    • XSS - h / sanitize xss 攻击, 白名单过滤
    • File download/upload
    • System command 禁止用户使用命令
    • HTTP Request methods 严格按照 RESTful 风格
    • Redirection
  3. 数据库安全
    • 批量赋值assignment params.require
    • SQL injection sql 注入攻击
    • Unscoped finds 判断是否是当前用户的数据
  4. Configuration(重要信息隐藏)
    • running environments
    • Passwords
    • filter log parameters 过滤log 敏感信息
    • Routes
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354