rails 一些简单的常识

发表于:,更新于:,By Sally
大纲
  1. 1. rails ui
    1. 1.1. Bootswatch 这个gem提供了很多ui模版
  2. 2. rails 引用图片的方法
  3. 3. REST (representational state transfer) 具有代表性的状态转移
  4. 4. Routes
  5. 5. 实现搜索功能
  6. 6. rails 查询
  7. 7. pluck方法
  8. 8. 使用Guard自动测试
  9. 9. Ruby 小语法
  10. 10. TODO

rails ui

  • 引入gem
1
2
3
gem "therubyracer"
gem "less-rails"
gem "twitter-bootstrap-rails"
1
2
3
4
5
6
// 安装bootstrap文件
rails generate bootstrap:intall
// 创建一个layout
rails generate bootstrap:layout
// 也可以为某个资源创建模版
rails generate bootstrap:themed ResourcesName

Bootswatch 这个gem提供了很多ui模版

  • 引入gem
1
2
gem "twitter-bootswatch-tails"
gem "twitter-bootswatch-rails-helpers"
  • 安装gem资源
1
2
3
4
// 安装该theme的基础文件
rails generate bootswatch:install cerulean(资源名称)
// 倒入一个线上的theme的变量文件
rails generate bootswtch:import cerulean
  • 最后,需要在application.css中配置一下
1
2
*= require cerulean/loader
*= require cerulean/bootswatch

rails 引用图片的方法

    1. 图片放在assets/文件夹中,直接使用图片地址
1
background-image: url("/assets/logo.png");
    1. 图片放在public/images/下,这样做
1
background-image: url("/images/logo.png");
    1. 使用sass-rails提供的辅助方法
1
background-image: asset-url("logo.png");
    1. 也可以使用erb来构建sass,文件名改成这样style.css.scss.erb,这样scss文件中就可以插入erb语法
  • rails中,会先解析erb文件,再解析sass文件,生成css文件
1
background-image: url(<%= asset_path "logo.png" %>);

REST (representational state transfer) 具有代表性的状态转移

Routes

    1. 这样写
1
get '/shabi', to: 'hone#index'
    1. 这样 collection member
1
2
3
4
5
6
7
8
9
10
resources :products do
# 给products中添加方法 /products/top
collection do
get :top
end
# 给products/:id添加方法 /products/:id/buy
member do
post :buy
end
end
    1. 选择方法
1
2
resources :users, only: [:index, :show]
resources :users, except: [:index, :show]
    1. 嵌套路由
1
2
3
resources :articles do
resources :comments
end
    1. namespace 和 scope
  • namespace
1
2
3
namespace :admin do
resources :products
end

当然,他的controller view 也应该在admin这个文件夹下

1
2
3
4
5
6
7
# controller : controllers/admin/products_controller.rb
class Admin::ProductsController < ApplicationController
end
# view : views/admin/products/index/html.erb
# model : models/admin/product.rb
class Admin::Product < ActiveRecord::Base
end
  • scope
  • 反过来想,如果让/admin/products下的代码去访问ProductsController,而不是Admin::ProductsController。就需要用到scope
1
2
3
scope '/admin' do
resources :products
end
  • concern 方法 : concern定义好的资源可以被其他resource多次引用
1
2
3
4
5
6
7
8
concern :commentable do
resource :comments
end
concern :image_attachable do
resources :images, only::index
end
resources :messages, concerns: :commentable
resources :articles, controllers: [:commentable, :image_attachable]

实现搜索功能

  • 可以提交form_for表单,执行where查询

  • 也可以使用ransack这个gem来实现

rails 查询

  • 避免N+1问题 使用includes , 类似的还有joins吧
1
2
3
4
5
6
7
8
9
users = User.limit(10)
users.each do |user|
puts user.address.phone
end
# 使用includes
users = User.includes(:address).limit(10)
users.each do |user|
puts user.address.phone
end

  • rails 查询中使用scope
1
2
3
4
5
6
7
users = User.where(sex: '男', is_enabled: true, is_successed: true)
# 如果is_enabled:true, is_successed:true 这两个条件在其他的放都用到了,那么就可以这么做
class User < ActiveRecord::Base
scope :is_enabled, -> { where(is_enabled: true) }
scope :is_successed, -> { where(is_successed: true) }
end
User.is_enabled.is_successed.where(sex: '男')
  • 当然,也可以为所有的查询使用默认的scope,eg:default_scope { where('deleted_at is null') },但是要慎用。如果在所有查询中有几个及其不能使用scope的,可这样去掉scopeUser.unscope.is_enabled.is_successed

pluck方法

1
2
User.select(:id, :name) # 返回的是AcriveRecord实例
User.pluck(:id, :name) # 返回的是包含结果的数组 [[id1, name1], [id2, name2]]

使用Guard自动测试

  • rake test 命令有点烦人。所以可以使用Guard自动运行测试。它会监视文件系统的改动,并运行测试文件
1
2
3
bundle exec guard init
然后编辑生成的Gruadfile文件,让guard在集成测试和视图发生变化后运行正确的测试
bundle exec guard # 运行监控

Ruby 小语法

  • %w[a b c] => [‘a’, ‘b’, ‘c’] %w 用来创建元素为字符串的数组

  • map 的简写

1
2
3
4
5
%[a b c].map { |index|
index.downcase
}
=> ['a', 'b', 'c']
%[a b c].map(&:downcase) => ['a', 'b', 'c']

TODO