Rails 3:a​​pplication.rb没有加载?

时间:2011-06-06 14:57:19

标签: ruby-on-rails ruby-on-rails-3 upgrade

我正在将Rails 2应用程序迁移到Rails 3,并遇到一个主要问题。我在我的application.html.erb中调用了一个名为check_author_role的方法,它正在抛出

undefined local variable or method `check_author_role'

check_author_role方法在名为lib / authenticated_system.rb的文件中定义。

我了解到Rails 3不再自动加载lib/目录,因此我将以下行添加到config/application.rb

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

我以为会这样做。但是我仍然得到错误。这意味着正在进行下列其中一项:

  1. config / application.rb未正确加载
  2. 我的自动加载语法错误
  3. 我以弃用的方式定义方法
  4. 我以不赞成的方式调用该方法
  5. 我已经在这里待了几个小时,无法做出正面或反面。在Rails 3更新之前,一切都很好。有人有什么建议吗?

    以下是lib/authenticated_system.rb的样子:

    module AuthenticatedSystem
      protected
    
      def check_author_role
        check_role('author')
      end    
    
      def check_role(role)
        if logged_in? && @current_user.has_role?(role)
          true
        else
          access_denied
        end
      end
    end
    

    这就是app/layout/application.html.erb的样子:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head profile="http://www.w3.org/2005/10/profile">
        ...
      </head>
      <body>
        ...
        <% if check_author_role %>
          ...
        <% end %>
        ...
      </body>
    </html>
    

    最后,这里是config/application.rb

    require File.expand_path('../boot', __FILE__)
    
    require 'rails/all'
    
    Bundler.require(:default, Rails.env) if defined?(Bundler)
    
    module MyApp
      class Application < Rails::Application
        # Settings in config/environments/* take precedence over those specified here.
        # Application configuration should go into files in config/initializers
        # -- all .rb files in that directory are automatically loaded.
    
        # Custom directories with classes and modules you want to be autoloadable.
        # config.autoload_paths += %W(#{config.root}/extras)
        config.autoload_paths += %W(#{config.root}/lib)
        config.autoload_paths += Dir["#{config.root}/lib/**/"]
    
        ...
    
      end
    end 
    

    我承认我对辅助方法的工作方式很模糊,特别是在Rails 3中。这就是我注意到的。

    lib/authenticated_system.rb

    # Inclusion hook to make methods
    # available as ActionView helper methods.
    def self.included(base)
      base.send :helper_method, :current_user, :logged_in?, :check_role, :check_administrator_role, :check_author_role, :has_role, :has_administrator_role, :has_author_role
    end
    

    我会诚实地说,我真的不知道base.send到底是什么。

    app/controllers/application.rb我有以下内容:

    class ApplicationController < ActionController::Base
      helper :all # include all helpers, all the time
    
      include AuthenticatedSystem
    

    同样,我担心我不完全明白这段代码到底是什么。

    奇怪的是,我注意到我在同一目录中也有一个名称非常相似的文件:app/controllers/application_controller.rb。它几乎是空的,只有三行。

    class ApplicationController < ActionController::Base
      protect_from_forgery
    end
    

    我的假设:app/controllers/application_controller.rb是新的Rails 3文件,而app/controllers/application.rb来自我的Rails 2站点​​的旧代码。我会测试一下。

2 个答案:

答案 0 :(得分:0)

AuthenticatedSystem模块是否已混入您的application_controller

如果是这样,那么视图中的方法将不会自动显示。

您需要添加以下内容:

helper :check_author_role
application_controller模块中混合后,

...在AuthenticatedSystem中。

答案 1 :(得分:0)

仅供参考,是的,app/controllers/application.rb已在Rails 2.3中重命名为application_controller.rb

http://guides.rubyonrails.org/2_3_release_notes.html#application-controller-renamed