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