线上Meetup问题准备(含他人问题及解答)|20170415
我的问题
问题1:
CRUD中Group.new
和Group.new(group_params)
的区别?
答:前者@group = Group.new
是虚的(空的、nil),对应的是def new方法,这个方法没有数据需要写入数据库中,这个方法是为了让对应的new.html.erb页面显示出来。而这个页面在最初是空白(nil)状态,因此不需要参数,实际上也没有参数。
后者@group = Group.new(group_params)
是实的,这里的实例变量@group中是含有数据的,对应的是def create方法(def update中原理类似),这个方法后面需要保存@group.save至数据中,而且对应的页面此时确实是有数据的,因此需要参数。def create含义就是:将资料Group.new(group_params)传入实例变量@group中,然后对实例变量@group调用save方法,将其存入数据中。
我的补充内容:
index、show、new和edit方法都仅仅是显示对应的页面,并不涉及将数据保存或更新到数据库,仅create、update和destroy方法才会与数据库进行交互动作。
因为update action和destroy action对应的网址与show action一样,均为group_path(group),那这样会不会出问题呢?
是这样的,group_path(group)的默认导向是show action, 我们在使用update action和destroy action时,必须额外指明method,这样就不会出错了。如下:
<%= link_to("Delete", group_path(group), class: "btn btn-sm btn-default", method: :delete, data: { confirm: "Are you sure?" } )%>
。
问题2:
问号?、感叹号!、冒号、空格的用法?自己的一些总结如下,但不是很清晰。请帮忙解答。
问号与感叹号:
(1)if !current_user.admin?
, 感叹号在单词前代表逻辑非,“?”多被用于返回Boolean值的方法。
(2)authenticate_user!
,“!”出现在方法名尾部的感叹号表明使用该方法是需要多加小心。通常情况下,不带感叹号的方法返调用该方法的一个拷贝,而带感叹号的方法则是一个可变方法,该方法会修改原来的对象,如Array类中的sort
和sort!
(3)是否还有其他用法?
答:目前就这样,碰到时在总结。
冒号:
(1)有时冒号在单词的前面<%= f.input :title %>
,有时在后面method: :delete
,这是如何区分的?前后的作用有什么不同。
(2)before_action: authenticate_user!
就是错误的,冒号应该仅跟authenticate_user!
,即 before_action :authenticate_user!
(3)冒号的其他用法,比如实测
rails g controller admin::jobs
与rails g controller admin/jobs
作用一样。:data => { :confirm => "Are you sure?" })
和:data => { confirm: "Are you sure?"})
作用一样。flash[:alert] = 'You are not admin’
与alert: 'You are not admin’
作用一样。has_many :participated_groups, :through => :group_relationships, :source => :group
和has_many :participated_groups, through: :group_relationships, source: :group
效果一样。only: [:new, :create, :update, :edit, :destroy]
是不是也可以写为::only => [:new, :create, :update, :edit, :destroy]
?
(4)冒号是否还有其他用法?
答:目前就这样,碰到时在总结。
空格:
(1)link_to(“My Groups”,account_groups_path)
中的link_to与后面的内容之间不能有空格。之前因为有空格出现过报错。
(2)method: :delete
中两个冒号之间又必须有空格,否则会报错,如果中间没有空格,atom中的颜色不会改变。
(3)空格使用注意事项有哪些?
答:目前就这样,碰到时在总结。
问题3:
Controller文件中用到的一些自定义属性(方法?),既可以在Controller文件中定义、又可以在对应的model文件中定义、有的甚至可以在helper中定义。这3者有什么区别?
答:大部分的自定义方法基本都可以在controller中定义,但是为了保持controller中的简洁,最好将其取出来,建议按照如下规则取出来:
- 与数据本身(即后端)相关的方法,最好定义在对应的model文件中。
- 与页面(即前端)相关的方法,最好定义在对应的helper文件中。因为在html中插入大段的ruby代码是非常不美观,也不便于维护的,应尽量保持HTML文件的干净。
- 有时考虑复用的情况,需要将其放在application_controller中。
问题4:
与上一个问题类似。helper和partial的区别是什么?(如flashes_helper
和_flashes,html.erb
)我的理解是Helper中定义公用的方法,而partial中是局部view文件,这样理解对吗?
Helper:
使用 Helper 的情境多半是:
產生的 HTML code 需要與原始程式碼進行一些邏輯混合,但不希望 View 裡面搞得太髒。
需要與預設的 Rails 內建的一些方便 Helper 交叉使用。
使用 Helper 封裝程式碼可以帶給專案以下一些優點:
Don’t repeat yourself(DRY)程式碼不重複
Good Encapsulation好的封裝性
提供 view 模板良好的組織
易於修改程式碼
partial:
Partial 簡單說就是程式碼中的一小段,通常使用在 HTML 中讓 View的Code 可以更乾淨,將重複使用到的區塊切成獨立的 Partial,比方說頁首頁尾、表單、社群插件等等,讓任何一個頁面都可以讀取這段Partial而不用重複寫一次一模一樣的Code。
使用 的情境是:
long template | 如果當檔 HTML 超過兩頁
highly duplicated | HTML 內容高度重複
independent blocks | 可獨立作為功能區塊
什麼時機使用:
partial 負責處理大片的 HTML code,或是之後要利用 ajax render 出來的片段。
helper 則負責處理跟邏輯判斷有關的東西。
问题5:
role = “alert” 的含义? nav-collapse的用途?<b class="caret"></b>
的作用?role、type、id的区别?
答:参考这两篇文章:Bootstrap:全局 CSS 样式;Bootstrap:组件。
问题6:
cp config/database.yml.example config/database.yml
这个的用途是什么?
答:yml是用来保存秘钥等私密信息的,而github能colone的文件都是公开的,如果上传了这个文件,坏人就可以破解这个文件,来做坏事。xdide老师在上传自己的job-listing时没有将这个文件上传,因此我们在clone时是缺少这个文件的。而如果缺少这个文件,我们本地运行时则会报错,因此需要cp一个虚假的yml.example文件到我们本地,并且命名为database.yml。这样就不会报错了。
问题7:
- 一些方法中带参数和不带参数的区别?如招聘网站6-4 step7中
jobs_helper.rb
中,这个方法def render_job_status(job)
为什么要带参数job?
答:因为这个方法是判断具体某个job的状态,所以需要带参数job,以便区分。
- 另外前天的nic老师的分享中没完全听懂,
admin_job_path(job)
和admin_jobs_path
的区别?是不是路径名中是集合(即带s)后面就不需要(job),如果是单个job的页面就必须有(job)?另外redirect_to group_path(@group)
和join_group_path(@group)
这里面为什么要有@符号?https://fullstack.xinshengdaxue.com/posts/84 step3
答:前面的理解【路径名中是集合(即带s)后面就不需要(job),如果是单个job的页面就必须有(job)】是正确的,@group是具体某个实例变量,下面的代码中之所以要有@符号,是因为我们要加入的就是@group = Group.find(params[:id])
这个具体的group,不是其他的group。
|
|
补充说明:
下面的第一段代码中,<% @jobs.each do |job| %>
中|job|这个是可以为任意字符或字符串的,它只是一个代指,可以代指@jobs这个集合中的每一个元素(而不是特定的某个元素),它可以改为|f|、|j|等等,如果改为|j|后面的 <%= link_to(job.title, admin_job_path(job)) %>
等应改为<%= link_to(j.title, admin_job_path(j)) %>
,从这里就可以看出他的代指功能,参考第二段代码。
而<% @jobs.each do |job| %>
中的@jobs是特指job的集合,这个集合从数据中捞出所有的job,然后赋值给|job|,接着进行下面的循环操作。
第一段代码,使用job指代@jobs中的元素。
|
|
第二段代码,使用f指代@forms中的元素。
|
|
问题8:
能否在解释下git checkout xxx
和 git reset --hard HEAD~1
区别?如果想返回特定的commit状态,如何返回?我有时出现bug后想回到上次,使用了这两个命令,发现atom中许多文件便为未保存状态,上方有蓝点提示,这时我需要将这些文件都cmd+s
一遍吗?
答:前者是大存档,后者是小存档。估计我之所以出现BUG就是因为之前的文件没有保存,正常情况下切换分支或者回到之前的commit状态并不会出现文件没保存,如果出现没保存的文件,只可能是在当时的commit状态就没有进行保存。
强烈建议:atom 中仅同时保持最多3个常用页签,正常cmd+s
保存完毕后,一定要cmd+w
关闭该页签。
他人的问题:
问题1:
<p><%= simple_format(@job.description) %></p>
这段代码什么意思?
答:顯示出指定的job的description,并且用simple_format顯示斷行。
问题2:
做CRUD時,要先在controller裡寫完七個動作(index, show, new,create,update,edit,destroy) 再去寫html。還是一個動作寫完就去寫對應的html? 因為教材在做Admin/jobs的CRUD時是先寫完CRUD再寫對應的html?
答:看个人习惯,建议先写1个动作,然后去写对应的html。这样方便分别commit,减少出BUG的几率。
问题3:
请问rails101和job listing里都做了hello world页面,但是这个页面最后网页上并没有用上,为什么要加呢?
答:因为安装bootstrop后无法知道是否安装完成。需要一个页面显示效果。
问题4:
缺乏动力、如何让自己上瘾、有成就感,奖励系统的建立?
答:
- 打鸡血的好去处,公众号右下角10个鸡血视频(开悟的蜗牛_微信公众号:guo_forrest)
- 相信自己,据上一期的总结,跟上学习进度,就已经到前40%了。
- 写博客,分享给他人看,教别人等获得成就感。可以使用Google Analytics 追踪你的 Logdown 流量,看看有哪些人阅读了你的博客。
- 新生大学的奖励系统:如最近发的得到500元卡和黑科技本子、各种比赛的奖品等。
- 你的学费18000元,即这2个月的内,每天学习的金钱成本是300元人民币,只要有一天不学习,你就白白丢掉了300元。还不赶紧去行动!
小结
很多问题,他人都已经总结过了。可以通过阅读上一期或同期学员的Logdown了解这些知识。