rails ui
1 2 3
| gem "therubyracer" gem "less-rails" gem "twitter-bootstrap-rails"
|
1 2 3 4 5 6
| rails generate bootstrap:intall
rails generate bootstrap:layout
rails generate bootstrap:themed ResourcesName
|
1 2
| gem "twitter-bootswatch-tails" gem "twitter-bootswatch-rails-helpers"
|
1 2 3 4
| rails generate bootswatch:install cerulean(资源名称)
rails generate bootswtch:import cerulean
|
- 最后,需要在
application.css
中配置一下
1 2
| *= require cerulean/loader *= require cerulean/bootswatch
|
rails 引用图片的方法
1
| background-image: url("/assets/logo.png");
|
1
| background-image: url("/images/logo.png");
|
1
| background-image: asset-url("logo.png");
|
- 也可以使用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
| get '/shabi', to: 'hone#index'
|
1 2 3 4 5 6 7 8 9 10
| resources :products do collection do get :top end member do post :buy end end
|
1 2
| resources :users, only: [:index, :show] resources :users, except: [:index, :show]
|
1 2 3
| resources :articles do resources :comments end
|
1 2 3
| namespace :admin do resources :products end
|
当然,他的controller view 也应该在admin这个文件夹下
1 2 3 4 5 6 7
| class Admin::ProductsController < ApplicationController end
class Admin::Product < ActiveRecord::Base end
|
- 反过来想,如果让
/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
|
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 小语法
1 2 3 4 5
| %[a b c].map { |index| index.downcase } => ['a', 'b', 'c'] %[a b c].map(&:downcase) => ['a', 'b', 'c']
|
TODO