这里有我的脚丫印😄

程序媛


  • 首页

  • 归档

simple_form_for 中 association 的使用

发表于 2016-09-16 |

simple_form_for 中 association 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# model
class Question < ApplicationRecord
has_many :invitated_users, through: :question_invitations, source: :user
end
# html
<%= f.association :invitated_users, :as => :check_boxes, label: false,selected: @question.invitated_users %>
# controller
# strong params 中加入
params.require(:question).permit(:invitated_user_ids=>[] )
即可自动保存关系

simple_form_for 中collection_check_boxes 的使用

发表于 2016-09-16 |

collection_check_boxes 的使用

1
2
3
4
5
<%= f.collection_check_boxes :tag_list, Tag.all, :name,:name
, :item_wrapper_class => 'checkbox',required: true
, input_html: { class: "tagsinput"} %>
<!-- :item_wrapper_class => 'checkbox' 可以实现checkbox纵排显示 -->

其中

:name``` 第一个在simple_form_for的github文档中是:id,因为我这里value和show value都是name,所以,这里就写成这样子了。
1
2
3
4
5
6
7
8
9
10
11
12
我这里是jquery判断是否选择过一项,如果选择了一项,就跳出循环,否则继续判断,如果一项都没选择,提示用户进行选择。
```js
var question_tag_list = $("input[type='checkbox']");
var checkedSize = 0;
question_tag_list.each(function(){
if ($(this).prop("checked")) {
checkedSize += 1;
return false; //只要勾选了一个,便符合必填,跳出循环,可提升效率
}
});

遇到的大坑就是,我用 $(this).checked不能返回true或者false,但是googel很多都是说这样可以。后来问了朋友,用 $("#id").prop("checked")成功了,具体参考 http://api.jquery.com/prop/

全栈营心得感想

发表于 2016-09-11 |

回想:从得知全栈营到课程结束的心理路程

得知全栈营

我是从笑来老师的《你学你的,用不着别人批准》中得知全栈营的,呃,就最后一小段,被我看到了。

看到这篇文章后,过几天我就辞职了。
因为,

  • 我现在工作状态不太好,两年了一直没有突破
  • 刚读了《七年就是一辈子》和《你学你的,用不着别人批准》,亢奋中
  • 可以和笑来老师一起学习?噫!
  • 一直想突破,想改变

当把我要去培训的这个事情说给我很多朋友后,他们都觉得我脑子进水了。因为对我们来说,一年也存不下5万。而我需要全部去借。不过也有人支持我,说,去吧,不然你又遗憾了。还有个朋友说,我自己不敢这样折腾,但是我很想看你折腾,然后看看究竟能折腾个什么出来。

最后,我还是决定报名。其实,等着报名我也是心急火燎的,因为,自从在《你学你的,用不着别人批准》这篇文章中看到过后,李笑来老师的微博、公众号里面根本没有什么动静,我以为就是说说,因为毕竟事起于他在微博上说的一句话,然后被攻击。为此我还专门去新生大学的客服去问。然后让他们一有报名方式公布,赶快打电话给我。(后来真的打给我了,可是这个报名好像不是他们负责,我觉得他们真的是很棒,还给这个客服发了条短信感谢,她也回复说了些鼓励我的话,嗯,心里觉得,自己真是选择对了)

之后就是去借钱了,甚至想到过信用卡套现;(得想好这个钱怎么凑,这是我这两年的经验,以至于前两天还和老师同学们分享了我的“借钱经验”)
最后,因为有一个朋友和老妈的支持,大头都借到了。然后坐等。

报名消息一公布,我就开始填报名表,填了之后,我的妈呀,又得等一周,才能知道自己会不会被录取。。。(我晕,火急火燎的等着)

开课前

是一个周二公布的录取结果,好吧,没有我,我挺难过的(因为我一直积极“准备”着;我也要用这个学来的表情符号表达情感!!! 相反的XDDDD!!!好么)。
周三周四,我赶紧接着去找工作了(之前辞掉,已经两三周没有工作了),周五拿到了offer,正准备去入职。居然戏剧般的情景又出现在了我的生命里。(好吧,现在我都在感谢,那最后没有去上课的人,给我缺下来的名额;也在唏嘘,是不是上天感到了我的真诚)

戏剧就是居然有人被录取了,但因为个人原因没去,缺3个名额,补录名单有我的名字!好吧,赶紧四处凑钱(虽然之前都已经说好,但是并没有打款到我的账上。)看到以报名时间确定最终录取名单,和只差3个名额。我着实急了一把(马不停蹄借钱)。最终,付费成功。当然也把offer辞掉了。

报名成功之后被告知有课前任务,我又开始买mac(从不敢瞻仰这么贵的电脑,官网免息分期),购买vpn(从不知道是这样翻墙的),环境配置(从不知道安装用一句命令行就搞定),初级教材,中级教材练习3遍(从不知道原来命令行开发这么爽,做的时候,去查了touch这个命令是什么,好吧,有一回答说:一看就是个小白)。

把这些准备工作都做好,我熟悉了mac,shell(终端),github的基本操作,部署到heroku,也大概知道ruby的开发流程了。这期间变化已经够大了,从上面括号里面的几个从不就可以看出来 。(心理很得意的XDDDD!!!)

我记得有一个朋友说,你这一跟着全栈营,逼格不知道提升了多少。(好吧,以前的我白痴和土到不是一般人)

开课后

第一天,我貌似9:40到的班级,老师等着班里迟到还没有来的人;后来很少有迟到的,有可能第一天大家探路吧。来到班级,带着花了5万(关键全是借的!),并感觉会改变命运的“赌博”心理来的。因为,我周围的人都觉得我脑子进水了(这么贵的钱 5万,这么短的时间 2个月)。但是,我内心是很坚定的,因为,我相信更好的学习方式和更牛的“教练”,5万会值得,2个月不短。(另外,我喜欢新鲜事物和改变)
第一天的感觉还有一个就是,我一个人不认识,但是之前做任务的时候有同学跟我私聊过,然后就开始找,他在哪,呃,找到了一个说过话的人(虽然是slack上),心理好多了。

其实,一开始我并没有发觉老师教学的价值(可能是我花了我难以承受的钱,希望一瞬间就能赚回来的心理?)和之前我参加的培训很不一样,老师很少讲课,都是实战。但是,我读过老师的文章:

放下你的無效學習方式
領悟「學習的黃金通道」

而且,我是知道自己并不知道,所以也傲慢不起来。就乖乖听老师的话。因为开课前老师布置的任务都很认真的完成,加上自己有一定的基础,一路上并没有什么曲折。不过我也是亲眼看见了0基础同学们的进步多么巨大。(这个变化,让我惊讶,因为,别的都先不说,怎么0基础这么两周就会开发网站了!呃呃,我真的不敢不承认这价值了。。。)

并且可以明显看到,认真思考,按照老师的学习方法走的人,进步都很大(这一点不假)。以至于我自己都开始惭愧,因为毕竟我有别的编程语言的经验,我有时感觉自己还不如他们!(这个感觉,持续到课程结束。我怎么可能傲慢,反而都是惭愧;因为我更能感知到这变化,对于从没接触到编程的人来说,有可能不知道老师让他们升级了多少。对,让我有两年java开发经验的人惭愧)

不过,一开始还有一个我不解的地方,就是老师几乎不怎么讲基础知识,除了每天答疑的那些。很少挑出来基础概念长篇大论的讲,这在之前我培训过的地方是很不一样的。因为他们都是首先讲很多基础理念。从语法,数据类型,变量,条件选择,循环结构等等一步步往后讲。但是,Xdite老师根本一步也没有这样走。我很担心他们基础知识是否扎实。
后来,我总结了一下,Xdite老师更希望我们获得的是自学能力,解决问题的能力。什么小知识不会了,就让我们google,还鼓励我们在github上提issue,并在issue下面把查到的、问到的答案或者她最后给解答过的,最后都整理成文字,回复到问题下面,有的还要求写成wiki。她是用让我们主动参与,自己动手的方式去掌握基础知识。(自己查阅,总结并分享给大家)
另外,奖励的小机制,也让大家比较踊跃的提问题,写总结。(呃,我们组没有得到最后的最高分,没有拿到奖品。。。哭)

第四周开始
开始产品用户调查,投票选择项目,分为四组,开始实际做一个真实项目。
这个方式的开设,我之前是不懂的,现在回想起来,感觉Xdite老师用心良苦吧。因为,只有在实践中才能遇到最真实的问题,同学们自己从无到有做出来一个完整的项目;选择小组长,写用户故事,分配任务,tower上管理项目,协作开发,每天的stand up会议,一切都跟真实工作似的。让我们不止明白什么是网站开发,也明白什么是优质的团队协作。而在真实的“工作”中,我们才明白自己需要会什么,怎么样解决问题,更包括了怎么样达成更好的团队协作。这个方案的神奇效果,真是让我又吃一惊。因为,同样是之前的传统培训没有的,他们那样的培训一开始接触公司真实项目是有些困难和不知所措的。(我就是这样过来的),但现在这样,我相信,大家进入公司之后,会很容易融入团队并快速开始工作。

当然,只要牵扯到团队协作,总也会遇到些协作上的问题,不过最后总能协调并突破(通过老师协调,同学之前的坦诚交流等)。我想这是提前给我们进入工作彩排了一次,在之后的职场中,我们肯定会吃一堑长一智,更轻松的应对团队关系。

你不得不承认这个班里的人,都是“聪明”、有自己思想的人。我心里很佩服他们,佩服每一个人的优秀;我们都是一群有目标的人。在这样的环境里待着,你每天都是进步的,每天都是打鸡血般的。
如果这样说,我想,不用我形容什么,这氛围中带来的力量就已经够你吃惊了,它给你带来的也许是你无法想象的思想冲击。

我最大的变化

上面说的似乎都是关于我对这个课程一步步的认可和思考。
下面我说一说对我影响最大的事情。

首先,我看到了,

比我有钱,比我优秀的人都比我更努力!

而且他们更不容易被别的因素干扰。更容易成功。其实,这对于来自农村的我,对于苦难是一笔宝贵财富的理解是更深一层的。
如果,苦难让你更坚强,更进步,这苦难真的是一笔财富;
如果,苦难让你更悲观,更容易自卑和受挫折,这苦难有可能局限住自己;
而且我发现,经常生活在幸福中的孩子,幸福感一直存在。他们眼界更高,他们不受经济约束太多,他们可以用上我觉得很昂贵的工具(mac),他们会为软件付费。
(通过他们,我还学到了理财,知道了很多升级认知的课程,很多很多!)

而我呢?从来不敢瞻仰有一台mac,从来见着付费软件都躲得远远的。
因为我穷,我一直躲避任何花钱的事物。这带来的后果是,我有可能会错过很多很多的体验。而且有可能最后成为思维惯性,我“有钱”了,也不敢花钱。也永远不会体验到付费的优质服务和效果。

另外,之前看过一篇文章:人丑要多读书;里面有个有趣的问题,当你看到比你漂亮N倍,比你气质好,比你有钱,读的书比你多,还比你更努力的人,你怎么想?
呜哇哇~,我真是不敢想了。是的,这样的人真的不少!
所以,我真的没有任何理由再去逃避,再去伤悲了!

你眼中的大牛有可能比你想象的还要牛N倍!

当你尝试去做任何一件他们做成的“小事情”的时候,你就知道这个“小事情”的“简单”程度不像你原来想的那样简单。比如,试试一直坚持写作、写博客。或者试试任何你认为令你赞叹的事情。(如果你真的也能做到,其实你也会被赞叹,哇,大牛!)

而且,做成功过一件事情,做另外一件事情成功的可能性是更高的!从我看到牛人分享他们的故事中就可以总结到。(Xdite老师的成长曲线,就更不是想象般的速度了,神速!以至于老师自己就说:“不要追赶我,我比一般人更努力,更狠”)

Xdite老师有时候心情一好,会分享很多有用的人生经验,以至于后来一听见她说话,自己没听到,都感觉错过了什么宝贝似的。而且,她说话永远都是热情洋溢,激情四射,很有感染力。在她身边,我想我是蔫不起来,而是一直亢奋。

懂的思考的人进步更快

我看到编程0基础的同学,只要他善于思考,那么他肯定也是特别主动,并且喜欢承担责任的人。这样的同学,我觉得想不进步都难。一开始,他们跟着老师入门的时候,会听老师的先模仿,而且这个方法真的是很必要的,就像Xdite老师说的,模仿是开始学习一样东西最好的一步,因为让你少走很多弯路,并且容易成功,从而不会很快受挫,最后,真的就成功了!等入门了,就开始慢慢深入思考了,主动型的,会思考的人受益就更大了,因为他们自己会找到自己不会的地方,不断思考并找到答案。在项目协作中,也能思考的比较多,不断的补充意见,积极参与,并不断优化产品。我时常想,如果我未来的同事是他们,那一定会超级爽的。因为,如此和谐,项目推进的也很好。

这两个月的消费

5万的学费,反正对于我这样的穷屌丝,真是十分的大。
14800的mac电脑,vpn一年180,居然我还付费买了软件(Mweb)
课程结束后,大多数人都会去参加成都的RubyConf;(机票,住宿)

好吧,从来没有坐过飞机的我,也买了机票。当付了1000多快的(单程)机票后,我真真的是急哭了,因为我瞬间想到了刚到北京时只吃包子或者饼的时候了(因为包子和饼一两块就能买到,一份盖饭或面条要十几块);真的是不舍得而且没钱。
也许你好奇,为什么5万的学费我花的还是很大方的,毕竟我很积极利索的借钱来到这个班不是?其实,我有一点比较好的,就是投资自己的钱,花下去从不眨眼。比如学习上,之前培训java,贷款最后加利息还了快两万,报尚德机构,我也是花了一万。所以,这次是花在交通上1000块(还只是单程)我怎么可能舍得,你和我平时花费比就知道了,来这个班,中午管饭,我早晚餐加起来10块钱都花不了,晚上有时候就不吃了。平时除了地铁费,几乎不花钱。以前我买了一件贵的衣服,也会心疼好几天,但是只要花在学习上,几乎不会心疼。

尤其是这次如此超过我消费能力的消费,给我带来的最大的好处,是让我真正明白什么叫做“付费就是捡便宜”。体验了mac的炫酷,一批优秀的软件,让我更加热爱编程,爱上写文章。不夸张的说,我一天不在这上面写点东西,都觉得不舒服了。就算真的没写,也会心里内疚一下,今天没有写点什么。。。(当然肯定不光是工具好用,流畅,就爱上写文章,和Xdite老师让我们写日记写技术博客养成的习惯有很大关系的啦~)
我想如果不是这次课程,我得多少年后才能体验上?而且我相信,以后我的消费观念肯定会不一样。而且,这次花钱如滴血的经验,让我以后还有什么事是让我不敢花钱的?

两个月来的学习氛围和资源

我想我以后是不可能变成一个不追求进步,安逸于现状,整天处于无聊状态,没思想的人的。

之前听过一个名人名言,我刚刚去google查了,好好看一下,因为我一直渴望这样的状态:

著名记者怀特·霍布斯说:“成功就是当你醒来,无论身在何处,无论年龄多大,你很快从床上弹起,因为你迫不及待地想去做你爱做的、你深信的、你有才华做的工作。”

虽然,我现在不是成功,但是,我到了那种,早上从床上弹起的状态!
因为我迫不及待的要去做我爱做的、我深信的、我有才华做的工作!

我认为,是受到这里的氛围感染,和我想不到的各种资源把我带入这种状态的。(我一直渴望的状态,可想而知,其实我的心理是多么的嗨皮的~)

最后的总结

让一个人完全改变了生活状态吧。
虽然我还是我,但已经相差甚远;
也许我之前也是一个愿意思考和愿意进步的人,但是,来到这里我坚定了这样的目标和生活!

就像新生大学公众号每篇文章后面有的那个动态的图显示的内容一样:
孤独,烦躁,焦虑,迷茫,自卑(哭脸)(到有了大家)相信我,你并不孤独(笑脸);
这个过程和我有了全栈营的老师和同学是一样的,这就是我最大的转变,最大的收获!

ruby前端加速-javascript

发表于 2016-09-10 |

ruby前端加速-javascript

把css放在最上面,即head里面,最先加载
把js放在最后面,最后加载

  • 把<%= javascript_include_tag ‘application’, ‘data-turbolinks-track’: ‘reload’ %>放在body最下面。
  • 然后在下面一行加入<%= yield :handwrite_javascript %>
  • 把html页面自己写的js代码,包入<%= content_for :handwrite_javascript do %>
    代码块中,它就会等application加载完毕再加载自己写的代码了。

  • 如
1
2
3
4
5
6
7
<%= content_for :handwrite_javascript do %>
<script type="text/javascript">
$(function(){
initUIDropdown();
});
</script>
<% end %>

SEO

发表于 2016-09-10 |

SEO

SEO 原则

  • Search Engine Bot 沒有「眼睛」
  • 帮网页画重点
  • HTM TAG
    • H1大标、H2中标、H3小标
    • P文章段落
    • strong 强调重点
    • image “alt” 取代图片的文字

没有SEO效果的

  • div 块级元素
  • span 行内元素

Headline 原則

  • H1 一页只能有一个
  • H2 一页只能有2-3个。如果有10个,搜索引擎以为你在作弊。
  • H3 一页可以有6-10个

    *所以不要乱用headling元素来装饰

Meta

  • title 建立独特、准确的网页标题 (不能每页都一样)
  • meta description 叙述本页内容 (不能每页都一样,建议在100字以内)
  • meta keywords 叙述本页关键字

权重

  1. title
  2. meta description
  3. h1
  4. h2
  5. h3
  6. strong
  7. p

秘诀

多把关键字放在标题或叙述

gem “seo_helper”的使用

参考链接:https://github.com/techbang/seo_helper

  1. 加入Gemfile
    gem “seo_helper”, “~> 1.0.3”
  2. bundle install
  3. 新建 config/initializers/seo_helper.rb
1
2
3
4
5
6
SeoHelper.configure do |config|
config.skip_blank = false
config.site_name = "约霸"
config.default_page_description = "约霸 海外留学 在线问答 留学咨询 禁止色情"
#config.default_page_image = "#{Setting.domain}#{Setting.default_og_url}"
end

4.为了可以一次写入title和description,在app/controllers/application_controller.rb中新增method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def set_page_title_and_description(title, description)
unless title.blank?
set_page_title title
end
unless description.blank?
set_page_description description
end
end
```
5.在action中set_page_title_and_description
```ruby
def show
set_page_title_and_description(“#{product.title}”,“#{product.descrption}”)
end

6.在layout中引入

1
2
<%= render_page_title_tag %>
<%= render_page_description_meta_tag %>

7.注意事项:
seo_helper要装1.0.3版的,在view中要把原先自定义的title删掉,如果<%= render_page_title_tag %>在原来的title之下就不会显示set_titles设置的title。而且会生成两个title

如何改善SEO

工具

  • google webmaster
    • 会告诉你哪里扣分
    • 具体告诉你他怀疑你哪里作弊

产品太多没办法被收录到?

解法

  • /rss
  • sitemap.xml.gz
  • sitemap generator
  • 通知google webmaster来爬

其他影响因素

  • 无mobile friendly会降分
  • 社交权重(google plus)
  • 开启速度

如何做Mobile Page?

  • Responsive Web Design
  • Bootstrap

两个页面

  • 使用CSS缩小
  • 使用gem判断是不是mobile浏览器,调整html与图片输出
    • gem “browser”
      • brower.device.mobile?
    • 出小图
      • 1024kb 400400 => 256kb 100100
    • 砍html => sidebar在mobile版面应该被砍掉

Helper设计方法举例

发表于 2016-09-03 |

helper 设计方法举例

  1. 尽量避免太多html code,无论是ruby的还是纯html
  2. view里面有太多让人难以理解的判断时,装在helper中并语意命名,让view更能理解。
    如:把
1
2
3
<% if current_user && current_user = @topic.user_id %>
#show shomething
<% end %>

改成

1
2
3
<% if editable?(current_user) %>
#show shomething
<% end %>

helper_method 與view_context

1
2
3
4
5
class ProductsController
def find_cart
@cart = Cart.find(session[:cart_id])
end
end

在view里面不能用find_cart
<%= find_cart.items %>

如果在controller和view都能用这个view。
必须要用helper_method声明这是一个controller级的helper。

1
2
3
4
5
6
7
class ApplicationController
helper_method :current_cart
def current_cart
cart = Cart.find(session[:cart_id])
return cart
end
end

这样就能在view里面用current_user

<%= current_cart.items %>

在controller里面也能用current_cart.

1
2
3
4
5
class ProductsController
def add_to_cart
current_cart.items << @product
end
end

view_context

1
2
3
4
5
class ProductsController
def show
@page_description = view_context.truncate(@product.desc, :lenght => 50 )
end
end

Model中好用的小知识

发表于 2016-09-03 |

Model中好用的小知识

ids

在strong params内加入post_ids:[],使用simple_form时只要写上f.association就可以了,传入controller的时候会形成post_ids这个array,rails会根据post_ids帮我们建立关联

1
2
3
4
<%= simple_form_for @drink do |f| %>
<%= f.association :materials, :as => :check_boxes %><br>
<%= f.submit "Submit" %>
<% end %>

collect(&:id)

1
2
3
users = User.all
users.collect(&:id)
users.collect(&:name)

这都可以把users中的id或者name都拿出来组成一个array

比如:

1
2
topics = [{id:1,title:"topic1"},{id:2,title:"topic2"}]
topics.collect(&:id)

执行结果 [1,2]

把id都变成浮点数

1
topics.collect{ |t| t.id.to_f }

或者

1
topics.collect(&:id).collect(&:to_f)

产生结果:[1.0,2.0]

includes

不好的写法

1
2
3
4
5
class Board < ActiveRecord
def
@bards = Board.all
end
end

然后在view中使用@board.topics,来获得每一个topic,如果有10个topics,这样系统会到数据库中查找10次。

如果用includes

1
2
3
4
5
class Board < ActiveRecord
def
@bards = Board.includes(:topics).all
end
end

在view中写@board.topics,就只会去数据库查找一次,把10个topic一次查出来,然后把抓出来的所有topic和board用board_id相关联。
这样做减少了数据库的负担。提到效能。

counter_cache

counter_cache是在做关联关系时计算数据量的一个方法。
不好的写法:

1
@board.topics.size

这代表我们都要算数量的时候都得通过sql去数据库计算topics,也会造成效能问题。
所以rails内建了counter_cache方法。

1
2
3
class Topic < ActiveRecord
belongs_to :board, counter_cache: true
end

在Board表中增加字段topics_count.这样以后Board内的topics有增减的时候,rails就会帮我们增减topics_count,这样在写@board.topics.size后,rails就会预设去找topics_count,不用重新生成sql去数据库中查找。

如果想写成自己定义的字段名称,如count_of_topics,那么可以这样做

1
2
3
class Topic < ActiveRecord
belongs_to :board, counter_cache: :count_of_topics
end

STI

单一表格继承 STI(Single-table inheritance)

Rails Guide 對此的說明:

a way to add inheritance to your models

让子类继承父类的属性和方法。
在父类中加入type,来表示类型

例:User有分 Native 跟 Foreigner;
使用场景:拥有一样的特性,但是行为不同时使用继承。

1
2
3
4
5
6
7
8
9
10
11
12
class User < ActiveRecord::Base
end
class Native < User
end
class Foreigner < User
end
native = Native.create(name:"foobar")
native.type
得出"Native"

Polymorphic Assoiciaion

Polymorphic Assoiciaion是rails内让两个不同的Model同时has_many一个model的做法。最常见的就是做留言系统的时候。

对文章可以留言,对看板留言,但是这些留言所需要的字段都是一样的,没必要建两套。
那么,这样的model只需要新增一个Comment model再用Polymorphic Assoiciaion关联就可以了。

1
2
3
4
5
6
7
8
9
10
11
class Comment < ActiveRecord
belongs_to :commentable, :polymorphic => true
end
class Board < ActiveRecord
has_many :comments, :as => :commentable
end
class Topic < ActiveRecord
has_many :comments, :as => :commentable
end

Comment里面必须包含两个字段。
commentable_id和commentable_type
commentable_type记录model名称
commentable_id记录该model下的id

Rails3之後的 migration 可以單獨寫t.references :imageable, polymorphic: true就會自動生成這兩個欄位。

1
2
3
4
5
6
7
8
9
class CreatePictures < ActiveRecord::Migration
def change
create_table :pictures do |t|
t.string :name
t.references :imageable, polymorphic: true
t.timestamps
end
end
end

view中好用的小知识

发表于 2016-09-03 |

view中好用的小知识

尽量只出现跟前端有关系的东西,不要把判断以及逻辑相关的code放在view。
不好的做法:

1
2
3
4
5
<% if current_user %>
<p><%= current_user.name %></p>
<% else %>
<p>Not Logined</p>
<% end %>

比较好的做法是将if else 改写在partial中,并把current_user.name用helper包起来。这样html code可读性大大提升。

Helper

Helper使用情景:

  • 产生的html code 需要与原始码逻辑混合,但不希望view里面太乱
  • 需要与rails内建的一些方便的helper交叉使用

helper的好处:

  • Don‘t repeat youeself 代码不重复
  • Good Encapsulation 好的封装性
  • 提供view模版良好的组织
  • 易于修改代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module BoardsHelper
# 回傳board的name,避免在view中做太多判斷
def render_board_name(board)
if board.present?
board.name
else
"unknown"
end
end
# 常常重複的區段也可以寫進 helper,統一管理
def render_board_name_path(board)
link_to(board.name, board_path(board))
end
end

在view中可以直接取用如下

1
<%= render_board_name_path(@board) %>

partial

partial 就是代码中的一小段,通常使用在html中,让view的code更干净,将重复的区块切成独立的partial,比如首页,footer,表单,等,让任何页面都能用这段partial,而不用重复写一摸一样的code。

partial使用情景

  • long template 如果html超过两页
  • highly duplicated html内容高度重复
  • independent blocks 可独立作为功能的区块

_topic_list.html.erb

1
2
3
4
5
6
7
<ul>
<% @topics.each do |topic| %>
<li># <%= topic.id %></li>
<li>Topic Name: <%= link_to(topic.title, topic_path(topic)) %></li>
<li>Description: <%= topic.content %></li>
<% end %>
</ul>

index.html.erb

1
2
3
...
<%= render "topic_list" %>
...

collection partial

上例可以改写
_topic_list.html.erb

1
2
3
<li># <%= topic.id %></li>
<li>Topic Name: <%= link_to(topic.title, topic_path(topic)) %></li>
<li>Description: <%= topic.content %></li>

index.html.erb

1
2
3
...
<ul><%= render :partial => "topic_list", :collection => @topics, :as => :topic %></ul>
...

partial&helper

partial 复杂处理大段html code或是之后利用ajax render出来的片段

helper则负责跟逻辑判断有关的东西

比如:
topics_helper.rb

1
2
3
4
5
module TopicsHelper
# 需要邏輯判斷的工作留給helper
def render_published_topic_name_path(topic)
link_to(topic.name, topic_path(topic)) if topic.is_published?
end

_topic_info.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
# partial只需要負責html的部分
<table>
<thead>
<tr>
<td>Topic name</td>
</tr>
</thead>
<tbody>
<tr>
<td><%= render_published_topic_name_path(topic) %></td>
</tr>
</tbody>
<table>

yiled in view

yield就是会被替换成样板的地方,基本上所有的html.erb最后都会显示在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
这样的好处是将网站版型固定。只需要在出现内容的地方用yield引进即可。
application.html.erb
```ruby
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<div class="container">
# erb檔案就是被引入這裡
<%= yield %>
</div>
#可以指定要yield哪個區塊
<%= yield(:javascripts) %>
</body>
</html>

还可以用content_for让content替换掉

1
2
3
4
5
```ruby
<%= content_for :javascripts do %>
#content here
<% end %>

Nested form

1
2
3
4
5
class Product < ActiveRecord
has_many :specs, :dependent => :destroy
accepts_nested_attributes_for :specs
end
1
2
3
class Spec < ActiveRecord
belongs_to :product
end

view/admin/products/_form.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%= simple_form_for [:admin, @product] do |f| %>
<%= f.input :name, :required => true %>
<%= f.input :description, :required => true %>
<%= f.input :price %>
<!-- nested form從這裡開始 -->
<%= f.simple_fields_for :specs do |spec| %>
<%= spec.input :name %> <!-- spec的name欄位 -->
<%= spec.input :detail %> <!-- spec的detail欄位 -->
<% end %>
<!-- nested form結束 -->
<%= f.button :submit, "Submit", :disable_with => "Submiting..." %>
<% end %>

Aws

发表于 2016-09-01 |

aws 密钥泄漏
编辑 .gitignore 文件并不是立即生效的,要看情况。如果你 ignore 的文件没有被追踪(untracked),比如新建的文件,则添加后(git add .gitignore 并 commit 后)可以生效。但如果是已经追踪的文件,需要通过清除缓存来解决
直接编辑 .gitignore 是不能忽略文件的,参考这里(泄露了 aws 密钥的惨痛教训)
http://stackoverflow.com/questions/11451535/gitignore-not-working
git rm -r –cached .
git add .
git commit -m “fixed untracked files”

参考:http://geophyli-blog.logdown.com/posts/777524-using-aws-service-areas-in-need-of-attention

render

发表于 2016-08-31 |

render :template

render template 意思是渲染指定的模板,render的特性是不跑controller action,直接将该action下的模板传出来。

render 特定的模板

render views/foo/bar.html.erb

1
render "foo/bar"

render 同一個 controller 下的 action 的 view,用 symbol和string都是一樣的:

1
2
render :foobar
render "foobar"

render :layout

rails 预设的layout是app/view/layouts/application.html.erb这个档案。(如果没有引用特定的layout,就会运用application这个layout)

controller引用别的layout示例:

1
2
3
class AdminsController < ApplicationController
layout "admin"
end

也可以指定某个action要使用特定的layout

1
2
3
4
5
6
7
8
9
10
11
12
class AdminsController < ApplicationController
layout "admin", :only => :new
# 另外也可以在render的時候就指定要使用哪一個layout
def show
render :layout => "admin"
end
# 甚至可以指定模板再指定layout
def index
render :template => "others/weired_topics", layout: "admin"
end
end

render :text

render 纯文字

render “嗨,自己的文字自己render”

render options

rails 接受以下四种render options:

####:content_type
rails 预设会找 text/html 类型的档案(除非我们有:json或:xml的选项)

但我们也可以借由:content_type设定其他的档案形态。例如:

1
render file: filename,content_type: "application/rss"

content_type类型可Google MIME搜寻

:layout

:location

location header是HTTP通讯协定回应时帮client重新定位的方法,当client丢一个request到server,我们可以丢回location这个header将client导到别的地方。

1
render xml: photo, location: photo_url(photo)

:status

指定server要丢什么样的http request status给client

1
2
render status: 500
render status: :forbidden
1…567…9

陈云莉 m18301662790@gmail.com

记录一些技术点,留下一些生活感悟

82 日志
25 标签
© 2017 陈云莉 m18301662790@gmail.com
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.3