Rails的新手:你如何在rails应用程序中使用application_controller.rb?

时间:2012-10-21 06:07:44

标签: ruby-on-rails ruby model-view-controller

我刚刚进入轨道并开始慢慢理解它。有人可以解释或给我关于在application_controller内部编码的好处或时间和原因的想法吗?什么是用例。你是如何在rails应用程序中使用应用程序控制器的?我不想在那里放太多代码,因为根据我的理解,这个控制器会被调用每个请求。这是真的?

2 个答案:

答案 0 :(得分:8)

ApplicationController实际上是您应用程序中每个其他控制器将继承的类(尽管这不是强制性的)。

我同意这样的态度,即不要将代码弄得太多并保持干净整洁,尽管在某些情况下ApplicationController会是放置代码的好地方。 例如:如果您正在使用多个区域设置文件并希望根据请求的URL设置区域设置,则可以在ApplicationController中执行此操作:

before_filter :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

这将使您不必分别在每个控制器中设置区域设置。您只需执行一次,并在整个系统中设置了区域设置。

同样适用于着名的protect_from_forgery,它可以在新的rails应用程序的默认ApplicationController上找到。

另一个用例可能是抢救应用程序中某种类型的所有异常:

rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
private
def record_not_found
  render :text => "404 Not Found", :status => 404
end

通常,如果你有一个所有其他控制器肯定都会使用的功能,ApplicationController可能是一个很好用的地方。

答案 1 :(得分:0)

我将它用于需要在多个控制器中使用的帮助程序和方法。一个很好的例子是Ryan Bates "Super Simple Authentication from Scratch"

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :admin?

  protected

  def authorize
    unless admin?
      flash[:error] = 'Sorry, that page is only for admins'
      redirect_to :root
      false
    end
  end

  def admin?
    session[:password] == "password"
  end
end

然后,您可以在应用中的任何位置before_filter :authorizeif admin?