安装gem "bullet"

1、打开bullet的github官网网页,认真阅读README.MD文件 2、在gemfile文件里,gem rails 及数据库gem的后面加上 gem 'bullet', group: 'development' 3、在config/environments/development.rb里加入初始化命令 config.after_initialize do Bullet.enable = true Bullet.alert = true Bullet.bullet_logger = true Bullet.console = true #Bullet.growl = true #Bullet.xmpp = { :account => 'bullets_account@jabber.org', # :password => 'bullets_password_for_jabber', # :receiver => 'your_account@jabber.org', # :show_online_status => true } Bullet.rails_logger = true #Bullet.honeybadger = true #Bullet.bugsnag = true #Bullet.airbrake = true #Bullet.rollbar = true Bullet.add_footer = true #Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ] #Bullet.stacktrace_excludes = [ 'their_gem', 'their_middleware' ] #Bullet.slack = { webhook_url: 'http://some.slack.url', channel: '#default', username: 'notifier' } end 由于是本地开发使用的,因此不需要使用发信及关联其他软件,故将相关的选项屏蔽 ...

September 28, 2017 · 1 min

Refactor & 效能提升第二章作业

1.为什么要将 CSS 放在最顶层,将 JavaScript 放在最底层? 首先,网页打开的时候会经历一个过程,这个过程中会加载html、还有下载相关文件、执行css和js。由于css是进行页面渲染的,所以通常需要一开始就执行。而如果将css和js文件放在一起,它的下载时间就会很久,这样就会出现画面很久才打开。又因为javascript是进行动作相应的,所以这一块实际上对现实页面的主题影响不大,因而把它放在后面。这样就可以实现页面的快速打开后,才加载js。这不但复合网页加载逻辑,而且也会使得用户在打开页面的时候会有很好的体验。 2.如何尽可能减少HTTP Requests? 减少http requestes的方法就是将文件打包下载,而不是多次请求。具体方法,就是将css文件以及js文件合并在一起,而不用分写在多个文件里,进而多次请求。然而,在使用ror的时候,实际上rails已经帮我们实现了这些功能。 3.CDN是什么?请用自己的话解释 CDN的英语是content delivery network,直译就是内容分发网络。通常我们读取文件都是之间链接到明确的一台服务器去取得,这样就是收到和这台服务器之间的网络链接所限制,而CDN就是解决这个问题的一个办法,具体的就是我们在取得资源的时候,不是直接连到源服务器。而是连接到这个内容分发网络,它是由分散的服务器组构成,它会缓存一些源文件在分散的服务器中,所以如果同过它取得资源时,如果该内容在他们服务器组中有储存,它就会自动的选择一台离我们最近的服务器给我们回传数据,如果内容在他们的服务器组中没有存储,它们会去源服务器读取文件并发送给我们,同时会进行一份缓存。 4.如何提升自己的网站加载速度? 提高自己的网站加载速度有以下方法:1、将css放在Html文件开头,而把javascript放在html文件末尾;2、使用CDN来分发网络资源;3、使用多节点访问网络资源;4、将css/js文件合并在一起;

September 28, 2017 · 1 min

Refactor & 效能提升第一章作业

打开一个网站的速度通常取决于三个因素:1、网页文件的大小(和网速决定下载需要的时间,通常一个页面100-200KB,网速通常不可控。);2、服务器所在位置;3、服务器生产页面所需要的时间(通常100-200ms)。网页打开的时间实际上是由这几个因素需要的时间的累加。 网页文件代码通常包含html、css、javescript三部分,他对打开网页的影响就体现在其对下载文件所需要的时间的影响上。后端代码通常包括ruby code以及数据库相关,其对打开网页所需要的时间的影响,体现在它运行代码从数据库拿出相关数据并生成相应的页面和文件需要的时间(也就是从收到quest请求,到routing、controller、model、view的时间)。服务器所在地就简单多了,主要看服务器离使用者的远近(对应相应的地理位置)以及服务器能够提供的带宽,它可以通过使用ping命令查看完成一次封包请求需要的时间来测试。 所以,针对这三点我们要提高一个网页的打开速度。其中,提高网页文件的大小属于前端调整。而提高服务器的位置以及服务器产生页面的时间属于后端调整。 然而,在进行代码优化的时候我们就不得不考虑一个问题,那就是从那块开始优化的时间投入产出比最高?也可以说,如果使得见效最快。 这就需要考虑两个问题,一个是优化需要的时间,还有一个是优化后的效果。 比较三者,可以发现调整网页文件的大小和服务器的位置效果最明显。而,调整后端命令,由于本身后端生成页面时所需要的时间量级已经小于两者,所以收效较低。举个例子如下: 调整前端架构或搬机器:从 10s 下降到 2s (1s = 1000ms) 调整后端代码或数据库架构:从 500ms 下降到 150ms 再来看看投入时间,由于服务器通常是成组的,而且调整服务器会涉及到很多问题,特别是跨大区域调整服务器是问题非常多。而修改网页代码以及后端程序生成代码则相对简单得多,只需要对代码进行调整就好。而其中,后端代码往往相互关联所以调整起来规模又会比调整相对独立的前端页面代码复杂的多。 所以,综上,优先调整前端代码的时间和效率是最划算的。特别是作为个体户程序员来讲,这个往这个方向思考会更有效率。

September 27, 2017 · 1 min

元学习课2017版学习心得

元学习课 元学习课是一门关于怎么学习的课程,它是重点针对类似于英语与编程这类技能类学习而设计的。全栈营的编程课程即是这么元学习课的践行版。所以,同其他课程一样,元学习课是需要践行的,如果学习了而不践行等于是浪费自己的时间与生命。 编程 编程最简单的描述就是输入一些东西,然后进行运算,最后输出一些东西。所以,本质上来说,它其实是很简单的一件事情。然而,一般人觉得他难的原因在于,大家并没有使用正确的学习方法。他就如同我们在生活中学习的其他技能一样,重点在于先模仿后理解,比如做菜、踩自行车、走路等等。如果一开始就纠结于原理,不但不能很好的上手,而且还会充满挫折感,导致从入门到放弃。 编程等技能的学习方法 元学习课的核心理论主要有三点:1、拼图理论;2、成就感;3、重复训练。 拼图理论 拼图理论是指,在学习过程中,将要学习的知识分散学习,而不需要强调从小到大,从前到后。也就是像拼图一样,一块知识一块知识的收集起来。而在收集到足够多的知识后,自然而然就会开始理解拼图之间的联系,这时候如果需要深入学习,再像登山学习一样,从头串到尾,从小概念联系到大概念。 成就感 在学习过程中保持持续的成就感很重要,因为一开始的激情很容易退却,如果没有后续的情绪激励则会放慢下来、或者产生厌学情绪,进而很容易放弃。 重复训练 由于我们是通过拼图式的方式学习,所以一定要通过多次训练将这些小知识巩固在我们的大脑里,进而形成“肌肉记忆”。正式这些基础的记忆为我们后面的深入学习奠定重要的基础。 游戏化学习 游戏化正式运用了上述三个理论点的学习模式,它通过将不同的知识点形成知识块的小关卡,同时以整合知识块形成稍大一些的知识块的模式,使我们一边获得升级成就感的同时,复习旧的知识,不断学习新的知识,让我们在游戏化的学习方式中不断进步。 认知心理学原理 游戏化学习的原理是源于人类的大脑认知模式,即左脑模式和右脑模式。左脑模式为分析模式,专注于细节间的解析,而右脑模式则专注于捕捉外界的大体框架。由于左脑模式的分析是基于已有的知识之间的联系,所以在新学一门技能的初始,脑内还没有建立很多相关的知识点,所以这个过程就会相当的“痛苦”,进而容易导致意志力薄弱的同学放弃,而右脑模式则更类似于拍照式的粗略记忆,所以并不会产生解析上的痛苦。因而,我们在学习新技能的初期,为了降低学习的难度于挫折感,可以试着关掉部分或全部的左脑分析功能,让其在学习过程中任期自发的解析,或者留到后期拥有足够的知识点后再从头来一遍理解式的学习。 践行 不管是否接受老师的这套理论,但是不妨先假设它是正确的,然后开始行动,行动之后,是否有效就自会明了。 初学者的错误认知 基于元学习理论的知识实际上真对应着初学者对于学习的错误认知,初学者通常认为技能学习必须要有天赋、必须看懂每一步、必须从基层原理学起、禁止使用捷径。它们实际上是错误的观念。真是由于使用了这些错误的观念,学习才变得枯燥和难受,进而需要我们咬牙坚持。实际上,取得技能和学会技能是两码事。取得技能即表示我们能够使用它,而学习技能不但表示我们能使用它,还能对它说出一二三四。比如语法、单词、腔调等等。每个人在学习母语的时候,都是先取得,再学会。但是在学习第二门语言和其他技能的时候,却常常想先学会,再取得。事实证明,大多数采用后者的学习都失败了,尤其是编程学习。一方面的原因,是大多数的编程人员,其实并不会教,他们只是想教,但是却没能get到教编程的技巧。在面对这个情况下,我们就需要发挥自学来摆正这个错误的认识了。比如,买一本实作型初学指南,做出小项目,重复做三遍(,之后再去补基础理论知识)。这三遍,可以先复制粘贴一遍、跟着打一遍,边尝试理解边跟着打一遍。这个过程中碰到错误要重点纪录,而且要连解法一起纪录。纪录错误的是因为,能加深印象。而正确的可以不用纪录,因为教材上面有。这样,在跳过一个又一个错误后,我们就可以不断的前进。 大脑运作原理 如前所述,根据认知心理学,学习的时候有两个要点:1、初速度要快,形成正循环;2、先利用右脑,形成肌肉记忆。而这是由大脑的运作原理所决定的。具体有以下几个方面: 1、大脑并不善于快速思考 大脑在进行快速思考的时候实际上依赖的是习惯,而并非是像慢速思考那样调取各种资源来解决问题。一个例子就是蜡烛、图钉和墙壁。 2、多数的思考,并不是真的思考,而是调用过去记忆所组成的结果 人的大脑记忆分为了个区间,一个是工作记忆,另一个是长期记忆。工作记忆区间就像电脑的内存,内容小、时间段、会丢失,但是存取速度够快。而长期记忆就像是外村依旧是硬盘,内容大、时间长、可重复调用,但是存取速度慢。简单的例子就是78的运算和70008000的运算。 3、人是利用已知的事物理解新的事物 理解一定程度实际上是记忆。一方面如果它不是记忆,那么我们理解完了以后就不可能记得下来,另一方面他又是在存在我们大脑中的知识点建立连接知识点。这一点和数据库的存储结构有点类似。git的使用指南,实际上就是一个很好的反例,它展示了我们在理解未知事物的过程中是多么费劲。对比的,人类在利用已知的事物理解新的事物时,就轻松很多。本质上,理解未知事物的过程也是在一点一点的把未知变成已知,然后在通过理解建立联系。 4、没有重复的练习,不可能精通任何脑力活 正如前面所说,我们进行快速思考的时候,实际上是调用已经形成的记忆。而这些快速调用的记忆又可以称之为“直觉”。他们是保存在大脑里的深刻的记忆,课程里的说法是深焊在肌肉里面的长期记忆。要达到这种程度的记忆,必须通过持续的、大量的、重复的练习,否则不会形成如此深刻的记忆。做不到这一点,对任何脑力活都不可能精通。 5、题海战术以及填鸭教育,有时是必须的 明白了大脑的工作原理,就可以明白,题海战术以及填鸭教育,有时是必须的。比如,我们最初的九九乘法表,以及最开始的古诗学习。他们都是通过先种下记忆点的方式,之后在逐步理解。而对于种下记忆点的方式,有两种强化的方法:一种是提取练习,另一种是迁移练习。 提取练习是通过靠记忆力将学到的知识回忆或者写下来,之后在于教材或者上一份知识比对的方法来强化相关记忆的。更进一步的,将写下的记忆教给别人,创造出一套属于自己的传播的学问模板。学习之后复习是很重要的一件事的,学习之后不复习,只不过是刷了个脑袋爽而已。而提取练习,就是很好的一种复习方式。 迁移练习是指我们在开始学习一个东西的开始,会进步非常快,这有两个原因,一个是因为初期的知识比较简单,另一个是教材设计者设计的比较好。但是当我们要具体使用这些东西去解决问题的时候就会发现适用不出来,这个就叫做新手运。解决这个问题的方法就是换个状况做迁移练习。在这个过程中要秉持取得技能的心态,所以快速取得成就感最重要,而且要明白的是,野路子不需要他人的认可。 最终,通过复盘与练习我们就可以将听与学的单条连结,通过教编程无数连结。 要点 首先,挑选高频小套路->练熟->提取->教别人->练习更多小套路。 其次,小套路兜出中套路->练熟->提取->教别人->迁移到兴趣主题 一万小时理论 通常是的从平凡到超凡需要经过一万小时的理论是怎么得来的,在业界成为专家通常需要五年,而这五年的时间并不代表说需要五年才能学会,实际上它是在学会以后经过一段积累起才成为了专家。便于编程也是如此,通常需要工作五年的时间才能从入门到成为编程专家。 德雷福斯模型 德雷福斯模型将成为专家的道路分成了五个阶段:新手、高级新手、胜任者、精通者、专家。 经验 通过执行这项技术,最后促成了思维与技能上的改变。有的人工作了十年,但是水平还是像一个新手一样,那是因为他的十年其实只是一年的有效经验重复了十年而已。 新手 新手无法独立完成某个事情,他们完成一个工作会遵循这么一个模式:Standard Operation Procedure。即当X时执行Y。 高级新手 能使用基本规则完成任务,能够独立解决问题。 胜任者 能把很多经验梳理成规则,属于团队核心。 精通者 能提炼出指导性的架构与方法。 专家 能创造出方法把所在领域往前推进。 人们常常认为业界人员分布在这五个阶段符合正态分布,即胜任者占大多数。然而事实上,是高级新手占多数,也就是说着不符合正态分布。实际比例是,高级新手>50%,精通者<10%,专家<1%。若以通常的职称来评定的话,通常的新手就是指初级工程师,高级新手就是工程师,胜任者就是资深工程师,精通者就是架构师,专家就是大神。而成为一个资深工程师往往需要3-5年。而成为高级新手,只需要400小时。 所以,成为高级新手的核心就是如果坚持400小时。一个一秒钟辨别大师&高级新手的方法是,问他们如何坚持学习。教你如何坚持做事的方法论的一般是高级新手,而回答白痴,我都不知道怎么坚持,才有可能是真正的专家。因为能成为专家的人必定是在兴趣之下投入大量的时间,光靠意志力是很难走这么远的。 坚持 坚持,是一种很低效的行为。它实际上表明你不喜欢现在正在做的事情,而大师们的坚持,其实是上瘾状态。看上去的坚持,其实只是一种习惯,一种由于上瘾而引发的习惯。 即便是之前提到的有效学习方法,即高频小套路->重复练习->烧到记忆里,如果没有感受到乐趣,也是很难持续执行的。 游戏化 游戏的核心就是建立习惯。所谓游戏,就是根据人类大脑原理,用来“引导建立习惯”的一套系统性公式。它形成习惯的原理是(Habit Loop)提醒行动->惯性行为->相关奖励。游戏的本质就是习惯+强烈的奖励。有一本书《Actionable Gamification》,就是游戏设计原理的。主要步骤如下:Discovery(发现这个游戏可以玩)->Onboarding(获得头几次胜利状态)->Scaffolding(达成多个胜利状态)->Endgame(没有胜利状态了,弃玩)。其中Onboarding阶段不能让人不知怎么玩,Scaffolding不能太单调/太难玩,到达这一阶段后,为了让用户不弃玩,会设置大小和时机都会变动的随机奖励,以上用户保持上瘾的状态。 所以,好的学习方法应该也能达到这一种,让用户上瘾的状态。然而,事实上很多人在教育之下是极度排斥上瘾的,理由也很简单,因为我们通常上瘾的东西,都是诸如游戏之类的影响生活的事物。然而,大多数的大神,其实也是瘾君子,他们其实并不排斥自己会上瘾的体质,但是会将他们用到合适的地方。这就是他们和普通人不同的地方,普通人无法控制自己的上瘾,所以后来变得拒绝上瘾。对于游戏,我们通常不要沉迷往往是有益处的,但是如果对于学习也如此,那么可能会在学习效果上大打折扣。虽然老师把这两个和平庸挂钩,但是我并不这么认为。事实上,还是有很多大神大师采用的是另一种非常自律的生活方式。当然,如果采用普通的方式没法学一个东西的话,不妨试试游戏化的学习。我个人学习英语就是试过了各种方法,最终尝试了游戏化进而走上正轨的。所以,比起逃离上瘾,不如将自己的瘾安放在合适的地方让他起作用。但是,则需要平时不要抵抗上瘾,而是将它合理利用与转化,这样才不会把你体内的上瘾机制给扼杀掉。 Xdite老师的方法是,比如她对一个游戏上瘾,她觉得不合适,就是跑去玩另一个更容易上瘾且生厌的游戏,而通过这个更容易上瘾的游戏,将之前一个游戏的瘾盖掉,进一步的通过这个游戏生厌后,她同时也就对游戏生厌了,这样就不会沉迷之前的那个游戏了。可以说这个方法因人而异,如果是对游戏比较执着的人,我想最后有一定可能还是会跑回去玩之前那个游戏的吧。 如何人工制造“成瘾” 游戏成瘾的本质其实是自我价值的他处实现,也就是说,实现自我价值才是成瘾的核心。比如健身族,迷恋自己的身材。学习族,享受性感的大脑。这都是通过这些东西实现了一定程度的自我价值。所以,依据这条理论,有一个方法可以创造学习的自我价值,那就是,将你学的东西拿去教别人。帮别人会收获到变动的意外奖励,进一步变得停不下来。 B = MAT Behavior = Motive + Ability + Trigger 行为 = 动机 + 行动能力 + 触发点 降低行动的门槛->提高行动的动机->触发行为的发生 ...

September 27, 2017 · 1 min

明志

天地悠悠,人海茫茫。 一心不改,道阻且长。 必有事焉,勿助勿忘。 忠乎恕乎,至大且刚。

September 22, 2017 · 1 min

20170621学习纪录

##Objective ###今天做了什么? 写ORID 全栈营 ###关于今天的学习,你记得什么? ####新旧知识 全栈营的课程框架:懂得拆、懂得做、做得完、卖得动、卖得好 懂得拆(Computational Thinking,User story) 懂得做(Programming,architecture) 做得完(Project managing) 卖得动(Marketing research,Solving value problem) 卖得好(UX,growthhacking) Xdite写ORID的时候,是白天简单记笔记(关键词),然后洗澡的时候回忆下,接着第二天再写出来,这就比我们直接第二天动脑子回忆轻松很多。 cd - change directory ls - list pwd - print work directory rake - ruby make db - database mkdir - make directory rm - remove rails g - rails generate rails s - rails server rails c - rails console 编程要做的事是:观察输入和输出是什么;把大问题拆成小问题;寻找资源;用电脑自动化解决问题; render大致是将数据提交给表单的意思,所以在controller和view里面本质是一样的,controller里面是直接给action表单,view里面是给partial表单。 当老师的情绪影响她做事的时候,她就去睡觉,她解释说因为她的血糖耐心已经用完了,注意力很重要,所以要去休息。 “所有的人都是从镜像模仿开始,掌握基本的高频小套路,熟练之后,才复盘补充、学习基础理论,最后牢固的。” “Computational Thinking => Programming;在这里给各位总结一下,编程是什么?编程是:观察输入是什么,输出是什么(就是大问题的起始条件和最终结果);把大问题拆解成可以实作的小问题;在实作过程中找到资源;用电脑自动化解决问题;如此单纯而已。” rake = ruby make ####遗留问题 ...

June 23, 2017 · 1 min

20170620学习纪录

##Objective ###今天做了什么? 完成了rails101附加作业 ###关于今天的学习,你记得什么? ####新旧知识 namespace就是域名空间,和资源不同,它没有具体的action,知识一个名字,所以和同层级的资源是并列关系。 调用经过中间表连接的数据时,使用的不是source名称,使用的是在model里面定义的名称。 will_paginate的使用方法有三步,安装、controller使用,页面加上页标。 面向对象的话,可以理解视觉限制和行为限制还有数据结构控制,分别通过view和controller还有model设限制。 ####遗留问题 无 ####涉及资源 网站:全栈营 ##Interpretive ###我们今天学到了什么? 要注意区分push github和heroku 的命令。 ###今天有什么重要的领悟? ####编程知识 总结will_paginate的使用方法有三步,安装、controller使用,页面加上页标。 ##Reflective ###你要如何形容今天的情绪? 晚上头疼,已经有段时间没有这感觉了,可能需要休息了。 ###今天的高峰是什么? 完成了作业。 ###今天的低点是什么? 头疼,学习学不下去。 ##Decisional ###我们会如何用几句话形容今天? 在解决了一件脱了很久的事情,把作业完成了。。 ###明天有什么计划? 写ORID 学习全栈营。

June 21, 2017 · 1 min

20170619学习纪录

##Objective ###今天做了什么? 写ORID 学习全栈营 开始做rails101的附加作业。 ###关于今天的学习,你记得什么? ####新旧知识 无 ####遗留问题 无 ####涉及资源 网站:LOGDOWN; 网站:全栈营 ##Interpretive ###我们今天学到了什么? 理财的重点不在具体花了多少钱,而在于你还有多少钱,大体花了多少钱。 涉及到新安装GEM的,不止在bundle install后重开 rails s,在设计到相关安装的命令的时候也一样要重开rails s。 教材里的“before_action 后面加的往往是一个 controller 内的 method”说明了controller的action也叫controller的method .destroy_all和delete_all是alixs 把“权限检查”的代码,套用到 update / destroy 上说明两个问题,第一是可以不通过edit来启动update因为前面edit已经设置权限了,这表明可以伪造表单来传送。第二,说明在程序码里面还是按顺序来进行运算的,因为这段代码在保存的那段之上。 在生成post的new的时候需要group是因为,的后面的create的时候需要页面提供group来确定关系,所以虽然在显示这一步不需要,但还是要提供。 拿数据是ror的一个重要内容。 has_many :participated_groups和has_many :members的红色字部分实测可以自己任意取名字。 ###今天有什么重要的领悟? ####编程知识 拿数据是ror的一个重要内容。 ##Reflective ###你要如何形容今天的情绪? 今天出门办事虽然过程复杂,但是情绪平稳。 ###今天的高峰是什么? 做附加作业的时候速度很快 ###今天的低点是什么? 做的太快,过程中出现了一些小bug,后已修复。 ##Decisional ###我们会如何用几句话形容今天? 办事的缘故,今天的进度不多。 ###明天有什么计划? 全栈营 ORID

June 21, 2017 · 1 min

20170618学习纪录

##Objective ###今天做了什么? 写ORID 全栈营 ###关于今天的学习,你记得什么? ####新旧知识 current_user是devise接入的user的model方法,所以能不能被model使用需要验证呢。 Model里面定义的methodview也可使用,比如:.is_member_of? 在一个对象的下面加入action,等于在它的这组资源上加入动作,这除了写代码,需要设置,调用路径和使用方法,这句是在routes里面设置的,“resurces :group do — member do — post :join — post :quit — end — end” member表示这个动作在groups资源名下且是对groups的单个对象进行的操作,post 表示使用方法,join和quit表示的是函数名称。有一个疑问就是,为什么是POST?试了发现在这个程序了,post、get、put、delete都可以,而另外用的abc则不行。难道这个方法名称和地址只是用来启动controller里面的函数用的吗?这个问题先留着,免得混乱 这和groups名下的posts只表示从属关系不同,member涉及到对group的操作,而posts只是在对自己操作,而且是在自己的controller文件里,它只是需要group的相应id而已。 脑袋模拟功能的时候要想到:动作、页面、数据。对应的来设计自己的网页。 运行rails g controller account/groups时,表示了两个信息,一个是我们要形成一个关于group的account,第二个就是我们需要对group对象进行动作。 在routes写入“ namespace :account do – resources :groups – end”只是设定了触发设定的链路,而并不是表示有两个groups,实际上他们操作的对象是同样的group,只不过形成两个controller文件及对应的动作和触发链路。 bootstrap真是提供了不少样式啊。 .participated_groups不用加.All表明,集合量和Group.All还是有区别的,后者相当于对一个抽象的概念进行运算才能拿数据。 如果对应一个url只有一个verb则可以省略verb,比如edit,但如果有多个的话,就需要,比如destroy、update和show这类公用地址的。 几个th和td是默认等间距安排位置的,所以他们的位置会随着网页大小的变化而变化。 在实现destroy功能的时候,漏了 @group = Group.find(params[:id])这一句,居然也能删除。。搞不懂。啊,是因为find_group_and_check_permit这个before_action里面已经有了。 current_user是系统参数信息,所以不用像在group里面打开posts那样还需要送group的值。 虽然附加作业在调用delete和edit的时候有传送group的数据,但是在controller里面并没有用到他们,试了一下,不使用@group来接受也没问题。 simple_format用来修饰网页的,所以它属于helper。或者它本来就是程序提供的helper功能,不过是本身自带还,还是bootstrap带的,还是simple_from带的这个就需要去验证才行了。 后面教材解释了,simple_format 是 Rails 内建的 Helper,可以在生成网页时帮忙把 \r\n 翻译成为 。 Helper 就是用 Ruby 写的“View 装饰的小方法”,你也可以自己定义。自制 Helper 都会放在 app/helpers 下。 partial 还可以用在循环上。例:“<%= render :partial => “group_item”, :collection => @groups, :as => :group %>”另外一个_group_item.html.erb 要注意区分“git push -u origin master”和“git push —all origin”的区别 和前面不一样,这课要选择推送分支“ git push heroku ch08:master”如果退主分支的话,“ch08:”省略就行了。 root ‘welcome#index’是指root指定到welcome的index ####遗留问题 ...

June 19, 2017 · 1 min

20170617学习纪录

##Objective ###今天做了什么? 写ORID 全栈营学习:Rails第三课:Rails101的第六章和部分第七章 和广州Meetup的小伙伴们进行购书交流 ###关于今天的学习,你记得什么? ####新旧知识 关于数据的method是在model里面定义的,并且在view里面又可以使用,比如我们的群成员判断功能。 当要定义多对多关系是一定要使用中间表,通过中间表的两个一对多完成多对多功能 在完成好了多对多的关联后,还要写清楚多对多的两个量的关系,也就是谁是谁的成员,又是谁加入了谁 No route matches [GET] “/groups/1/posts/new”,如前面说的,方法+路径。 教材题目是设计 Post 的 model 架构,设计model就是设计架构吗? routes是定义资源调用地址的,资源需要你写,但写出来要使用的话还要给他们赋予一个地址 resources :groups do – resources :posts – end就是一种定义地址的方式 数据关联是在model里面设置的,action在controller里面也已经有了,view也是匹配的controller,而controller的文件夹,gourps和posts是并列的,所以这个路径地址实际上影响的只是url。 数据关联的另一个意义,可能还是在于参数绑定,比如:group和post的id同时获取,那么就是post的id在group的id的名下。 命名规则相当于用group_post替代了group 另外还有第八个动作PATCH,但它和PUT一样都是update功能。是同名还是同功能? 命令git commit -m “add posts nested route”中的,nested意思就是数据关联其实就是巢状链接?nested route的意思是,这个uri了带有关联关系吧? :only => [:new, :create]和only: [:new, :create]等效。多参数就加上中括号,若果只有一个参数就不用中括号,其他的一样。 在post里@group = Group.find(params[:group_id])的写法是:group_id,而在group里的写法是:id。是否在每个对象里:id默认是自己model的id,而XXX_id则是你要调用的其他model的标准写法? 可能在@post.group = @group及@post.user = current_user这类写法里,group和user和group_id和user_id是等效的吧,就像人和身份证号。 用group_path(@group)而不用group_posts_path(@group),那是因为前者的页面已经包含了我们的信息,而且这样可以少一个post的index的action。 @posts = @group.posts表示一旦建立了数据关联,就可以轻松调用。 method除了是“程序语句”,还可以同时是“功能叙述”。比如,.order(“created_at DESC”)用.recent代替。 Scope是Rails 里面的一个内建 API可以用来包装一些查询式,让代码更直观一些。你可以想像成,拿来包装“常用 query”的方法。 scope是在model里面定义,表明controller里面使用的关于数据的方法应该就是model的方法。 教材的解释,应征了前面关于model和dababase交互的理解。rails的ActiveRecord框架帮我们完成了翻译,下面一句话摘自教材。 教材:“实际上呢,Model 里面的所有语句,看起来是“Ruby 语句”,实际上是 Rails 帮我们“翻译”成为了数据库语句。(这一套叫 ActiveRecord 框架)” 不单单是命令窗的指令输入的返回文字有意义,rails s的运行log也有很多有用信息。 “因为数据库语句也是个“巨坑”,Rails 开发的目的,在于希望程序员专注于“产品”的逻辑设计,而花上少一点时间去纠缠非常底层的细节。在刚开始学习过程中,其实你是不太需要去纠结数据库语句的,大部份你想要捞的数据,ActiveRecord 都能帮你搞定,而且可以“形容”的非常“口语”。” 推送上heroku的程序,不需要bundle install,但是需要heroku run rake db:migrate 要去哪里才能知道,我想要的功能要用什么 gem 呢?*各种功能的gem一览: “RubyToolbox” 涉及到多对多的关系是,就需要建立个中间表,明确完三个表之间的关系后。还要通过命令明确主从关系,比如,教材:“has_many :participated_groups, :through => :group_relationships, :source => :group”和“has_many :members, through: :group_relationships, source: :user”,分别先后在model的user.rb和group.rb里面明确关系。这样当捞 user.participated_groups 时,就会捞出“参与的所有群”。如果只执行上面两句命令中的一句,那么只能捞出members或者participated_groups的。 建立联系后,就可以通过activerecord去捞出数据。这个实现了比主从键直接捞数据更复杂的功能。 “=> #<Group id: 8, title: “Board 1”, description: “Board 1 body”, created_at: “2017-06-17 06:37:08”, updated_at: “2017-06-17 06:37:08”, user_id: 2>”和“ => #<ActiveRecord::Associations::CollectionProxy [#<Group id: 8, title: “Board 1”, description: “Board 1 body”, created_at: “2017-06-17 06:37:08”, updated_at: “2017-06-17 06:37:08”, user_id: 2>]>”的区别在于前者是直接从数据库读出来,后者需要通过ActiveRecord去捞出来。 这个与“2.3.1 :004 > g.user — User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = ? LIMIT ? [[“id”, 2], [“LIMIT”, 1]] – => #<User id: 2, email: “2@qq.com”, created_at: “2017-06-16 13:01:10”, updated_at: “2017-06-16 13:01:10”>”的命令直接捞出的User还不一样,更复杂也更强大。 “2.3.1 :004 > g.user — User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.“id” = ? LIMIT ? [[“id”, 2], [“LIMIT”, 1]] — => #<User id: 2, email: “2@qq.com”, created_at: “2017-06-16 13:01:10”, updated_at: “2017-06-16 13:01:10”>” 还有 “2.3.1 :005 > g.members — User Load (0.1ms) SELECT “users”.* FROM “users” INNER JOIN “group_relationships” ON “users”.“id” = “group_relationships”.“user_id” WHERE “group_relationships”.“group_id” = ? [[“group_id”, 8]] — => #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, email: “1@qq.com”, created_at: “2017-06-16 12:08:50”, updated_at: “2017-06-16 13:00:39”>]>” 关于数据的方法要在model里面定义,教材上的另一种解释:“is_member_of?(group) 为什么这一段要放在 User 的 model 里?因为它是要被 user 所使用的判断式” 所以要看对象选择写函数的地方,比如join!和quit!就写在user的model里,因为这个是user要进行的操作,而且是设计到数据库数据的操作。 在model的里定义了方法后,还要思考方法启动方式,这个工作是在controller里完成的,如果默认的7个action都不能作为调用途径的话,那么就需要新建另外的action,则需要设置routes和在controller写出对应的action。虽然使用rails console可以使用,但还是要考虑到网站作为面向对象的程序怎么给用户触发的问题。 ####遗留问题 ...

June 18, 2017 · 2 min