我正在将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/**/"]
我以为会这样做。但是我仍然得到错误。这意味着正在进行下列其中一项:
我已经在这里待了几个小时,无法做出正面或反面。在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站点的旧代码。我会测试一下。
答案 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