【问题标题】:New to Rails: How are you using application_controller.rb in your rails app?Rails 新手:您如何在 Rails 应用程序中使用 application_controller.rb?
【发布时间】:2012-10-11 07:40:49
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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 可能是一个好地方。

【讨论】:

  • 所以应用程序控制器中的任何东西都会在每个页面上运行,对吧?
  • before_filter 将为每个页面运行,只要控制器继承自 ApplicationController
【解决方案2】:

我将它用于需要在多个控制器中使用的助手和方法。一个很好的例子是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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多