2011-03-22 42 views
0

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

在我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 

在我的意见/用户/帐户/ show.html.erb文件我有

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

上面的代码工作,如果我浏览URL http://<my_app_name>/users/accounts/1但如果我以这种方式将show.html.erb文件作为另一个视图文件中的模板:

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

我得到的错误:

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

为什么?我怎样才能解决这个问题,以便在另一个与另一个控制器相关的视图中呈现AccountsController show_authorization方法时可用于show.html.erb视图?

P.S.:因为show_authorization仅与AccountsController及其视图文件相关,所以我不想在“application_controller.rb”文件中插入相关代码,但将其保留在“accounts_controller.rb”中。

回答

0

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

实际的问题是,除非您明确要求包含它们,否则不同的控制器会对您的帐户控制器助手一无所知。

例子:

module Users::AccountsHelper 
    code_here 
end 

class ApplicationHelper 
    helper Users::AccountsHelper 
end 

所有帐户的辅助方法将是跨应用程序提供

+0

看到更新的答案 – Sigurd 2011-03-23 16:44:38