从User.rb模型访问ApplicationHelper

3

这是一些简单的代码,但它没有起作用:

module ApplicationHelper
  def industries
    industries = ['Agriculture','Food', etc.]
  end
end

class User < ActiveRecord::Base
  include ApplicationHelper
  validates_inclusion_of :industries, :in => ApplicationHelper.industries
  ...
end

当用户操作运行时,此代码会出现 undefined method 'industries' 错误。你知道我该如何正确引用辅助程序(或更好地仅引用 industries)吗?


编辑

根据下面 Mauricio 的答案中的代码,如何在控制器和视图中访问 INDUSTRIES?我很难使 industries 在任何地方都可用,但它确实需要在我的应用程序中。

1个回答

7

你绝不能做这样的事情。ApplicationHelper不应该被包含在模型中。最好的解决方案是:

class User < ActiveRecord::Base
    INDUSTRIES = ['Agriculture','Food']
    validates_inclusion_of :industries, :in => INDUSTRIES
end

module ApplicationHelper
    def industries
        User::INDUSTRIES
    end
end

现在,您已经以简单而美妙的方式完成了它。

编辑

无论何时需要访问行业,您都应该使用:

User::INDUSTRIES

就是这样。


1
谢谢你的回答Mauricio - 你能告诉我为什么我不应该做我试图做的事情吗? - sscirrus
另外,我如何从我的视图中访问行业? - sscirrus
Mauricio的回答听起来是正确的方法。在将来,了解您还可以将全局变量放置在config/application.rb或任何环境文件中可能会有所帮助。当信息不特定于模型时,人们通常会这样做- https://dev59.com/RXE85IYBdhLWcg3w43wX - stephenmurdoch
我有一个类似的情况。当我按照Mauricio的回答进行操作时,Rspec崩溃了: C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/rspec-core-2.8.0/lib/rspec/ core/configuration.rb:698: stack level too deep (SystemStackError) - George Shaw
只有当我使用你的解决方案时,才会出现这种情况。当我在ApplicationHelper.rb中定义了与行业(州和国家)相等的内容,并且在模型文件中的模型类之前包含了ApplicationHelper后,Rspec运行正常。但是,当我将代码移动到模型文件并按照你提供的方式删除了includes时,Rspec崩溃。 - George Shaw
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接