private protected

保护级别方法的使用
本文探讨了在编程中如何合理地使用protected和private保护级别的方法,特别是在类文件较大的情况下,通过区分不同访问级别的方法来提高代码的可读性和可维护性。

如果 controller 或其它单个文件太大,而有时候让你感到心烦。
你会把一些不对外可见的,设为 private protected,通常情况下这够用了。
但也有例外,你最后把只在‘本文件’出现的方法设为 protected, 为什么?
因为它是面对对象的,而又有很多短方法,难免会有大量‘委托’方法(也就是简单的调用),此时若不区分 private protected 会让其变得能以理解。

举例如下 :

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :logined?, :current_user
  before_filter :load_site, :set_locale

  protected

  def load_site
    @site = Site.first || Site.new
  end

  def set_locale
    I18n.locale = set_locale_from_user || set_locale_from_accept_language_header || I18n.default_locale
  end

  def set_locale_from_user
    current_user.try(:locale)
  end

  def set_locale_from_accept_language_header
    request.compatible_language_from(AllowLocale)
  end

  def require_logined
    unless logined?
      store_location
      redirect_to login_url
    end
  end

  def require_no_logined
    if logined?
      redirect_to root_url
    end
  end

  def current_user
    @current_user ||= login_from_session || login_from_cookies unless defined?(@current_user)
    @current_user
  end

  def logined?
    !!current_user
  end

  def login_as(user)
    session[:user_id] = user.id
    @current_user = user
  end

  def logout
    session.delete(:user_id)
    @current_user = nil
    forget_me
  end

  def login_from_session
    if session[:user_id].present?
      begin
        User.find session[:user_id]
      rescue
        session[:user_id] = nil
      end
    end
  end

  def login_from_cookies
    if cookies[:remember_token].present?
      user = User.find_by_remember_token cookies[:remember_token] 
      forget_me unless user
      user
    end
  end

  def login_from_access_token
    @current_user ||= User.find_by_access_token(params[:access_token]) if params[:access_token]
  end

  def store_location(path = nil)
    session[:return_to] = path || request.fullpath
  end

  def redirect_back_or_default(default)
    redirect_to(session[:return_to] || default)
    session[:return_to] = nil
  end

  def redirect_referrer_or_default(default)
    redirect_to(request.referrer || default)
  end

  def forget_me
    cookies.delete(:remember_token)
  end

  def remember_me
    cookies[:remember_token] = {
      :value   => current_user.remember_token,
      :expires => 2.weeks.from_now
    }
  end
end

你所要做的就是把只是被‘调用’而对即使是其子类也用不到,也就是只在此文件出现的方法设为‘protected’ ....

appcontroller 里的很多方法其实都可以封装成 ‘gem’ 的,如果你在两三个项目里都用到的话。
避免重复!

转载于:https://my.oschina.net/kelby/blog/193134

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值