bundle install --without production  不安装production中的gem

./configure && make && sudo make install  把源代码编译成可执行的程序

$ bundle exec rake -T db  可查看所有与数据库相关的任务,rake db:就是用来管理数据库的,是数据库不是表

rake -T 查看所rake 命令

heroku run rake db:migrate

bundle exec rake db:migrate VERSION=0  数据库回退到指定版本,0就是数据库最开始的状态

超链接
show  <%= link_to user.name, user %>
delete  <%= link_to "delete", user, method: :delete,  data: { confirm: "You sure?" } %>
edit   <%= link_to "Settings", edit_user_path(current_user) %>

生产环境

rails s --environment  production
bundle  exec  rake db:migrate RAILS_ENV = production
bundle exec rake db:migrate:reset   删除数据库中数据

调试
debugger

测试
页面内容测试(view),数据库数量/内容测试(model),controller测试

先单元测试,测试单个功能。再从页面考虑,根据行为,集成测试
rails g integration_test signup
rake  test:integration
bundle exec rake test TEST=test/integration/users_login_test.rb
bundle exec rake test TEST=test/integration/users_login_test.rb  TESTOPTS="--name test_login_with_valid_information"

测试中cookies中不能使用符号键,但可以实用字符串键   cookies[:key]会返回nil    cookies['key']会返回正确的值

测试中可以实用assigns获取controller中的实例变量,比如@user,test中assgins(:user)

安全随机数
SecureRandom.urlsafe_base64  返回A-Z a-z 0-9 -_    长度为22的随机字符串,每一位有64种可能

cookie
cookies[:remember_token] = { value: remember_token,   expires: 20.years.from_now.utc }
cookies.permanent[:remember_token] = remember_token    permanent  rails会自动将时间设为20年之后

cookies.signed[:user_id] = user.id     存入浏览器前,安全加密cookie
cookies.permanent.signed[:user_id] = user.id

User.find_by(id: cookies.signed[:user_id])
BCrypt::Password.new(remember_digest).is_password?(remember_token)

辅助方法
1.year.from_now           10.weeks.ago               1.kilobyte               5.megabytes

类方法
def self.new_token
SecureRandom.urlsafe_base64
end

class User < ActiveRecord::Base

class << self

def digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end

def new_token
SecureRandom.urlsafe_base64
end

end

Active Record
new_record? 检测对象是新创建,还是已经存在于数据库

路由
创建是post,编辑是patch。  构建form_for(@user)表单,根据@user.new_record?判断该发送什么请求

局部模板
rails将@users组成user对象列表,传给render后,rails会自动遍历这个列表,然后使用局部视图_user.html.haml渲染每个对象
一。<ul class="users">
<%= render @users %>
</ul>

_user.html.erb
<li>
<%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
</li>
二。
局部模板名没必要_user,如果@users.each do |foobar|,则是render foobar
<ul class="users">
<% @users.each do |user| %>
<%= render user %>
<% end %>
</ul>

bundle exec
bundle exec annotate  
05-11 22:11