1.动态制定布局文件,通过判断用户角色来改变页面布局
class ProjectsController < ApplicationController
layout :user_layout #判断用户角色来改变页面布局的方法
def index
@projects = Project.find(:all)
end
protected
def user_layout
if current_user.admin?
"admin"
else
"application"
end
end
end
2.使用content_for自定义layout输出
首先在我们默认布局文件application.html.erb中添加布局
<head>
<!-- START_HIGHLIGHT -->
<title>Pragprog Books Online Store</title>
<!-- END_HIGHLIGHT -->
<!-- <label id="code.slt"/> --><%= stylesheet_link_tag "application", media: "all",
"data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %><!-- <label id="code.jlt"/> -->
<%= csrf_meta_tags %><!-- <label id="code.csrf"/> -->
<%= yield :head %>#这里是我们添加的布局
</head>
在我们的视图文件中添加下面代码就可以增加内容到头部中了
<% content_for :head do %>
<%= stylesheet_link_tag 'projects' %>
<% end %>
最终效果如下:
# ....
<meta content="authenticity_token" name="csrf-param" />
<meta content="f0lXLqidBuHFrm57kTBOU2Xw75jSiXJy7byAEF2LO/E=" name="csrf-token" /><!-- <label id="code.csrf"/> -->
<link href="/stylesheets/projects.css" media="screen" rel="stylesheet" />
</head>
3.虚拟属性
class User < ActiveRecord::Base
# Getter
def full_name
[first_name, last_name].join(' ')
end
# Setter
#该方法为设置 full_name = ..
def full_name=(name)
split = name.split(' ', 2)
self.first_name = split.first
self.last_name = split.last
end
end
4.权限控制最佳实践
在我们User模型中为用户添加一个布尔字段,默认是falserails generate migration add_admin_to_users admin:boolean
在migrate文件中修改默认值如下
class AddAdminToUsers < ActiveRecord::Migration
def change
add_column :users, :admin, :boolean, default: false
end
end
至此用户模型实例都会有一个admin?方法来判断用户是否为管理员
class ApplicationController < ActionController::Base
helper_method :admin?
protected
def admin?
#这里我们通过获取当前
@current.admin?
end
#获取当前用户
def current_user
@current ||= User.find(session[:user_id])
end
def authorize
unless admin?
flash[:error] = “Unauthorized access”
redirect_to home_path
end
end
end
5.简单但是非常实用的缓存方法,计数缓存
点惭愧,做rails也2年了,竟然不会用counter_cache,刚才google了counter_cache,感觉这个还挺有用的,举个例子,在sina微博中,微博的评论数和收藏数就可以使用到counter_cache,使用了counter_cache,我们就不需要在数据库中查找该博客下的所有评论,然后再计算评论数了,举个具体的例子吧.
class Blog < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :blog, :counter_cache => true
end
注意: blogs中有一个字段是comments_count(整型),当添加和删除comment的时候,会在它所对应的blogs中的comments_count加或减1,这里需要注意的是destroy和destroy_all,可以触发blogs中的comments_count加或减1,而delete和delete_all则不会。
此外如果要指定特定的名字的话呢,就 :counter_cache => :pinlun_counts,这样在blogs中就使用pinlun_counts,而不是comments_count.
来源:http://zhangcaiyanbeyond.iteye.com/blog/1186713
PS自定义的一段计数器代码,留着以后使用
class AddLineItemsCountToCart < ActiveRecord::Migration
def self.up
add_column :carts, :line_items_count, :integer, default: 0
Cart.reset_column_information
Cart.find_each do |c|
Cart.reset_counters c.id,:line_items
end
end
def self.down
remove_column :carts,:line_items_count
end
end
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。