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模型中为用户添加一个布尔字段,默认是false
rails 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

天赢金创
338 声望21 粉丝

天赢金创,天赢金创,天赢金创,天赢金创,天赢金创,天赢金创天赢金创,天赢金创


引用和评论

0 条评论