全栈工程师成长记

编程重新定义人生

你以为你以为的就是你以为的? 第十三周周记

周一、修改机制

取消 devise 邀请注册

devise 原先的注册过程很简单,要想取消邀请注册的功能,基本思路就是逆向操作。

  1. 如果不知道从何开始逆向操作,先看常规操作说明书 devisedevise_invitable
  2. 改 gemfile:取消使用 devise_invitable 这个邀请注册功能相关的 gem;
  3. 改 controller:去掉 RegistrationsController 里邀请注册的自定义代码,使用默认的 new 、create action,如果 user model 里有自己想要用的 column ,记得在 controller 里面使用 def sign_up_params 允许对应的栏位;
  4. 改 model:取消 validates(:validatable,:confirmable)
  5. 改 routes:取消 routes 里邀请注册的相关路径,例如: devise_for :users, controllers: { confirmations: "confirmations"}
  6. 改 views:在 form 表单中使用取消邀请注册后还能继续允许的栏位。

创建新 pg 数据库

如果开发环境使用的是 PostgreSQL ,给 rails 项目使用新名称的 database 即可更换一个新的数据库,这样做的目的在于能够保留之前的数据库,rake db:drop 要少用。

1.修改 config/database.yml :

config/database.yml
development: &default
-   database: old_development
+    database: new_development

2.rake db:create > rake db:migrate

周二、重构关系

修改/取消model之间的关系

注释 model 之间的关联关系代码即可,如has_many 、belongs_to 、 validates

遇到的坑:
如果你暂时不想用某个 table,假设名称为 product,使用 rails d model product 进行删除的话,会导致 db/migrate 里面对应的 xxxx_creates_product.rb 也会被删除。
相关的后果是,如果 db/migrate 里面还有其他的 xxxx_add_user_id_to_product.rb 之类的 migration ,将会无法执行 rake db:migrate 。原因是不存在 product 这个 table,自然无法往里面增加 column ,解决的办法是继续删除相关的 migration 。

总结:
对数据库的操作要谨慎,不要轻易删除 model

周三、制作页面

如何将一个页面从无到有制作出来?

1.构思该页面大概要呈现的内容;
2.根据内容的量、上下文关系、页面跳转关系决定排版样式;
3.使用工具(纸和笔、sketch、ps等等)将排版草图画出来;
4.借用 Computational Thinking 思维拆解页面结构,从大到小、从外到里用 Box Model 进行定位;
5.写 css 、html,看页面效果,继续调试,如此循环;
6.Enjoy it~

周四、优化页面

Chrome 和 Firefox 的浏览器调试工具是修改页面样式的利器,两个浏览器配合使用效果更佳。下面是调试工具的一个使用小技巧(感谢机智的 rebecca 同学)。
问题:
用元素选择器(即工具栏最左边的那个鼠标按钮)无法选到页面中想要的元素——比如页面中有一行空白,但它的上一个元素和下一个元素都没有显示出具有对应的边距。
方法:
在 Elements 标签页(以 Chrome为例)里依次展开 body 元素下的三角箭头,将光标移动到元素附近(上下)的几个标签,你会很快发现那个空白元素被 Box Model 标记颜色覆盖,点击对应的 div 代码确定选中它,在调试器窗口右边的 styles 标签页就能找到对应的属性了。
比如上面描述的空白是某个 A class 的 margin-bottom 产生的。但是用元素选择器只能选中覆盖在 A class 上面的 B class ,而 B class 并没有定义 margin-bottom ,所以会造成视觉理解的差错。

周五、优化页面

制作非 resources group 路径

背景:
假设我们创建了一个 common controller 来放置一些静态公共页面(也不需要对应的 model) ,这时如果在 routes 里面使用 resources :common 的话就会产生 7 个 action 路径,而我们实际使用的是 index 和 其他自定义的路径,于是 new\create\edit\update\destroy 等路径就变得多余。以下用 index 对应“首页”、about 对应“关于我们”、contact 对应“联系我们” 为例,我们来制作一个清爽的 routes 。

方法:
1.修改 config/routes.rb:

config/routes.rb
  root to: "common#index"
  get '/about', to: "common#about"
  get '/contact', to: "common#contact"

2.修改 app/controllers/common_controller.rb:

app/controllers/common_controller.rb
class CommonController < ApplicationController
    
      def index
      end
    
      def about
      end
    
      def contact
      end
  end

3.在 app/views/common 下面新增对应的 index.html.erb、about.html.erb 、contact.html.erb


当页面内容不足时,页脚依然显示在窗口最底部

背景:
假设当前浏览器显示窗口的高度是 1000px,导航栏(navbar)高度是 50px,页脚(footer)高度是 100px,导航栏和页脚之间的内容高度是 550px,这三者加起来的总共显示高度是 700px。
当我们不对页脚的显示方式具体定义的时候,页脚就会按照从上到下的顺序显示在当前浏览器窗口的 600px 到 700px 之间,然后在 700px 到 1000px 之间留下 300px 的空白区域,从视觉上产生一种很不协调的割裂感。
以本例的高度来说,理想的显示效果应该是导航栏和页面内容显示在 0px 到 600px 之间的高度,600px 到 900px 之间的空白由页面背景颜色(或者背景图片)填充,页脚显示在 900px 到 1000px 之间。

方法:
修改全局 css 样式,以下任何一项属性都不能少。

html {
    min-height: 100%;
    // 定义显示内容最小高度100%
    position: relative;
    // 相对位置   
}

body {
    margin-bottom: 100px;
    //  footer 留出显示高度(需要和下面定义的 footer 高度保持一致)
}

footer {
    bottom: 0;
    // 定义 footer 的底部边缘与浏览器窗口的底部边缘之间的距离
    height: 100px;
    // footer 的高度为 100px,可以改为其他高度
    position: absolute;
    // 绝对位置   
}

网上搜索出来的方法大多是将窗口分为上、中、下三个区域,然后给各个区域使用不同的 class ,相对显得麻烦。而本方法直接对默认 html 元素进行定义,相对就省时省力很多了。

周六、区块链新手座谈会

收获一、工业时代早期,人们无法在蒸汽机刚面世的时候,用农业时代的思维去想象未来会有怎样的场景。如今,区块链最大的想象空间在于,它就是这个信息时代的“蒸汽机”。
收获二、比特币和各种币只是区块链应用的冰山一角,不在区块链的世界里投机,而是做价值投资,享受行业发展红利。

头脑风暴

本周在闲聊间无意提到了支持正版的问题,进而延伸到道德观、生存与现实等问题,这让我想起了之前看过的一本书《你以为你以为的就是你以为的吗?》,我们脑子里很多自以为坚定的“想法”、“价值观”、“信念”、“立场”等等其实常常会出现前后矛盾,有时仅仅是转换一个语境,就会给出截然相反的答案,下面是书中的一段摘录:

我有自己的观点,但我自己不一定都赞同

紧张关系1:道德观是相对的吗
这种紧张关系的出现,是因为有些人赞同“客观的道德标准并不存在,道德判断无非是特定文化的价值取向而已”,同时还认为“种族灭绝行为是人类有能力犯下滔天恶行的明证”。半数参加网上测验的人都存在这种紧张关系。
这两种信念之间的紧张关系在于,其中一种信念认为道德只不过是文化和习俗问题,另一种则把种族灭绝行为当作“罪恶”来谴责。但是,声称“种族灭绝是罪恶的”似乎超出了文化和习俗这一界限。也许你可以说,“种族灭绝是罪恶的”这种观点仅仅表达了特定文化的价值观,它并不意味着种族灭绝对所有文化和所有时代来说都是罪恶的。然而,很少有人能真正接受这种观点合理推论所得的结果:1994 年卢旺达的胡图民兵屠杀图西人在你的文化看来是罪恶的行为,但从胡图人的观点来看,屠杀没有过错;并且,没有理由去比较这两种道德判断的优劣。但是,如果道德判断真的仅仅“只不过是特定文化的价值取向”,那么完全禁止种族灭绝与酷刑的价值观,又怎么会优于与之相反的价值观呢?

如此看来,清晰思考任重而道远。