文章目录
  1. 1. 我的问题
    1. 1.1. 问题1:
    2. 1.2. 问题2:
      1. 1.2.1. 问号与感叹号:
      2. 1.2.2. 冒号:
      3. 1.2.3. 空格:
    3. 1.3. 问题3:
    4. 1.4. 问题4:
    5. 1.5. 问题5:
    6. 1.6. 问题6:
    7. 1.7. 问题7:
    8. 1.8. 问题8:
  2. 2. 他人的问题:
    1. 2.1. 问题1:
    2. 2.2. 问题2:
    3. 2.3. 问题3:
    4. 2.4. 问题4:
  3. 3. 小结

我的问题

问题1:

CRUD中Group.newGroup.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类中的sortsort!
(3)是否还有其他用法?
答:目前就这样,碰到时在总结。

冒号:

(1)有时冒号在单词的前面<%= f.input :title %>,有时在后面method: :delete,这是如何区分的?前后的作用有什么不同。
(2)before_action: authenticate_user!就是错误的,冒号应该仅跟authenticate_user!,即 before_action :authenticate_user!
(3)冒号的其他用法,比如实测

  • rails g controller admin::jobsrails 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 => :grouphas_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文件,这样理解对吗?

答:参考nic助教的文章。

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 step7jobs_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。

app/controllers/groups_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
+ def join
+ @group = Group.find(params[:id])
+
+ if !current_user.is_member_of?(@group)
+ current_user.join!(@group)
+ flash[:notice] = "加入本讨论版成功!"
+ else
+ flash[:warning] = "你已经是本讨论版成员了!"
+ end
+
+ redirect_to group_path(@group)
+ end
+
+ def quit
+ @group = Group.find(params[:id])
+
+ if current_user.is_member_of?(@group)
+ current_user.quit!(@group)
+ flash[:alert] = "已退出本讨论版!"
+ else
+ flash[:warning] = "你不是本讨论版成员,怎么退出 XD"
+ end
+
+ redirect_to group_path(@group)
+ end

补充说明:
下面的第一段代码中,<% @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中的元素。

code1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table class="table table-boldered">
<% @jobs.each do |job| %>
<tr>
<td>
<%= link_to(job.title, admin_job_path(job)) %>
</td>
<td>
<%= link_to("Edit", edit_admin_job_path(job)) %>
<%= link_to("Destroy", admin_job_path(job), :method => :delete, :data => { :confirm => "Are you sure?" }) %>
</td>
<td>
<%= job.created_at %>
</td>
</tr>
<% end %>
</table>

第二段代码,使用f指代@forms中的元素。

app/views/resumes/new.html.erb
1
2
3
4
5
6
<%= simple_form_for [@job, @resume] do |f| %>
<%= f.input :content %>
<%= f.input :attachment %>
<%= f.submit "送出" %>
<% end %>

问题8:

能否在解释下git checkout xxxgit 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:

缺乏动力、如何让自己上瘾、有成就感,奖励系统的建立?

答:

  1. 打鸡血的好去处,公众号右下角10个鸡血视频(开悟的蜗牛_微信公众号:guo_forrest)
  2. 相信自己,据上一期的总结,跟上学习进度,就已经到前40%了。
  3. 写博客,分享给他人看,教别人等获得成就感。可以使用Google Analytics 追踪你的 Logdown 流量,看看有哪些人阅读了你的博客。
  4. 新生大学的奖励系统:如最近发的得到500元卡和黑科技本子、各种比赛的奖品等。
  5. 你的学费18000元,即这2个月的内,每天学习的金钱成本是300元人民币,只要有一天不学习,你就白白丢掉了300元。还不赶紧去行动!

小结

很多问题,他人都已经总结过了。可以通过阅读上一期或同期学员的Logdown了解这些知识。

文章目录
  1. 1. 我的问题
    1. 1.1. 问题1:
    2. 1.2. 问题2:
      1. 1.2.1. 问号与感叹号:
      2. 1.2.2. 冒号:
      3. 1.2.3. 空格:
    3. 1.3. 问题3:
    4. 1.4. 问题4:
    5. 1.5. 问题5:
    6. 1.6. 问题6:
    7. 1.7. 问题7:
    8. 1.8. 问题8:
  2. 2. 他人的问题:
    1. 2.1. 问题1:
    2. 2.2. 问题2:
    3. 2.3. 问题3:
    4. 2.4. 问题4:
  3. 3. 小结