无法使用'helper_method'和渲染模板

时间:2011-03-22 10:59:45

标签: ruby-on-rails ruby ruby-on-rails-3 templates controller

我正在使用Ruby on Rails 3,我试图设置一个helper_method,它应该仅适用于控制器(例如:AccountsController)以及与之相关的所有视图,当它的视图在另一个视图中呈现时与该控制器无关的视图。我从Railcast "Restricting Access"获取灵感。

在我的accounts_controller.rb文件中,我有

# Just to know, I am using a User namespace...
class Users::AccountsController < ApplicationController
  helper_method :show_authorization

  def show_authorization
    false # This returning value is just an example
  end
end

在我的views / users / accounts / show.html.erb文件中,我有

<% if show_authorization %>
  You are authorized!
<% else %>
  You are NOT authorized!
<% end %>

如果我浏览网址http://<my_app_name>/users/accounts/1,但是如果我以这种方式将show.html.erb文件作为模板呈现在另一个视图文件中,则上述代码有效:

<%= render :template => "/users/accounts/show", :locals => { :account => @account } %>

我收到错误:

NameError in Users#show 
undefined local variable or method `show_authorization' for #<#<Class:...>

为什么呢?如何在show_authorization视图中使用AccountsController show.html.erb方法在另一个与另一个控制器相关的视图中呈现时,如何解决这个问题呢?

PS :由于show_authorization仅与AccountsController及其视图文件相关,我不想在'application_controller.rb'文件中插入相关代码,保留在'accounts_controller.rb'中。

1 个答案:

答案 0 :(得分:0)

helper_method实际上与accounts_helper.rb中的定义方法几乎相同(从技术上讲,它是针对帮助程序类的eval代码)。为了使用这个帮助器,你需要在一个帮助器模块中定义它,并将它包含在控制器中,其中show template意味着要呈现。

实际问题是,在您明确要求包含它们之前,不同的控制器对您的帐户控制器帮助程序一无所知。

示例:

module Users::AccountsHelper
  code_here
end

class ApplicationHelper
  helper Users::AccountsHelper
end

所有帐户帮助程序方法都可以跨应用程序使用