2013-02-17 117 views
0

Rails的pluralize方法没有像我想要的那样工作(单词不是英文的),所以我着手尝试自己的解决方案。我在ApplicationController开始用这种方法简单:Rails返回完整对象而不是整数

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>参照`inflect(article.word_count, "word")行。

后来我想也许inflect已经是Rails的方法,它是某种命名冲突的,但不要紧,我改变了方法的名称,它不断给我同样的错误:undefined method ``whatever' for #<#<Class:0x3ea79f8>:0x3b07498>

我然后在控制台上测试它,它工作正常。这是怎么回事?

+1

放入ApplicationHelper你活用方法,而不是ApplicationController中 – house9 2013-02-17 00:05:51

+0

@ house9也做到了,谢谢!你可以扩展为什么我应该把它放在那里,而不是在ApplicationController上? – 2013-02-17 00:24:27

+0

...添加了一些额外的信息作为答案 – house9 2013-02-18 02:33:00

回答

1

Put your inflect method in ApplicationHelper, not ApplicationController

默认情况下,在你的助手所有的代码混合到的意见

认为是其自己的实体,它不是控制器的一部分,当视图实例被创建(自动当你的控制器动作执行)它会通过您在控制器操作中定义的任何实例变量,但无法直接访问控制器方法

注意:您可以在控制器中定义方法以使其通过使用helper_method宏暴露给您的视图 - 请参阅这篇文章的更多信息 - Controller helper_method

但一般而言,您将定义的助手类视图helper方法,而不是在控制器

+0

很好的答案,谢谢! – 2013-02-19 07:55:36

相关问题