Rails返回完整对象而不是整数

时间:2013-02-17 00:01:00

标签: ruby-on-rails

Rails的pluralize方法不能像我想的那样工作(单词不是英文)所以我开始尝试自己的解决方案。我在ApplicationController

中使用此方法开始时很简单
def inflect(number, word)
  if number.to_i > 1
    word = word + "s"
  end      
  return "#{number} #{word}"
end

在我的观点中称之为:

<% @articles.each do |article| %>
  <%= inflect(article.word_count, "word") %>
  <%= inflect(article.paragraph_count, "paragraph") %>
  ...
<% end %>

但是这让我:

undefined method `inflect' for #<#<Class:0x3ea79f8>:0x3b07498>

当我认为它应该只是一个整数时,我发现它引用了一个完整的对象很奇怪,所以我在控制台上测试了它:

article = Article.first
=> (object hash)
article.word_count
=> 10
article.word_count.is_a?(Integer)
=> true

所以我快速投入了words = article.word_count.to_i,但它没有抛出TypeError,它实际上什么也没做,并且仍然返回相同的错误:undefined method ``inflect' for #<#<Class:0x3ea79f8>:0x3b07498>引用{{ 1}}行。

然后我想也许`inflect(article.word_count, "word")已经是一个Rails方法了,这是某种命名冲突,但无论我改变方法的名称是什么,它都会给我同样的错误:{{1 }}

然后我在控制台上对它进行了测试,它运行良好。发生了什么事?

1 个答案:

答案 0 :(得分:1)

  

将您的inflect方法放在ApplicationHelper中,而不是ApplicationController

默认情况下,助手中的所有代码都会混合到视图中

视图是它自己的实体,它不是控制器的一部分,当一个视图实例被创建时(当你的控制器动作执行时自动),它会传递你在控制器动作中定义的任何实例变量,但是没有访问权限直接控制器方法

注意:您可以使用helper_method宏在控制器中定义方法以将其公开给您的视图 - 有关详细信息,请参阅此帖子 - Controller helper_method

但通常你会在helpers类中而不是在控制器中定义视图助手方法