Rails 3.1引擎:如何让引擎application_controller与客户端应用程序的application_controller对话?

时间:2011-09-19 06:33:32

标签: ruby-on-rails ruby-on-rails-3.1 rails-engines

我有一个新的可安装的rails 3.1引擎,我需要客户端应用程序,它是包含此引擎的rails应用程序,用于定义基于通用权限的方法。

所以,我想要的是在我的引擎的博客控制器中说出如下内容:

before_filter :redirect_unless_admin

然后我想将它留给客户端应用程序来定义谁是管理员。但是,每当我尝试这个时,我都会得到:

NameError in Blog::BlogsController#show

undefined local variable or method `redirect_unless_admin' for #<Blog::BlogsController:0x000001058aa038>

我的客户端应用控制器看起来像这样:

class ApplicationController < ActionController::Base

  # Required by blog engine
  def redirect_unless_admin
    if !logged_in?
      set_session_redirect
      redirect_to login_path, :notice => 'Please log in.'
    elsif !current_user.admin?
      set_session_redirect
      redirect_to root_path, :notice => 'You do not have permission to view this page.'
    end
  end

在我的引擎应用控制器中,我有以下内容:

module Blog
  class ApplicationController < ActionController::Base
  end
 end

有人可以告诉我如何设置它以便我的引擎的博客控制器可以与我的客户端的application_controller对话吗?

2 个答案:

答案 0 :(得分:4)

答案最终变得痛苦而且简单。在我的引擎中,我的博客控制器有以下内容:

module Blog
  class BlogsController < ApplicationController

然后我看了我的引擎的应用程序控制器并看到了这个:

module Blog
  class ApplicationController < ActionController::Base

问题是我希望我的引擎看看它的application_controller然后是主应用程序的application_controller,如果没有找到,所以我改为这个并且一切都很好:

module Blog
  class ApplicationController < ::ApplicationController

如果您知道不同/更好/更优雅/最佳实践/解决方案,我很乐意听到。

答案 1 :(得分:0)

你应该研究一下

rails plugin new forum --full        # Engine
rails plugin new forum --mountable   # Mountable App

引擎就像是父应用的扩展。因此,您应该能够调用应用程序helper_methods。

可安装的应用与父应用隔离。我相信你正在使用一个可安装的应用程序。请查看使用上述命令更改为rails引擎。