2

我有一个Entry模型has_many :tags。我希望能够在文本输入中列出我的标签(即“tag-1,tag-2”等),但是,我遇到了问题。

如果我只是使用

form_for(:entry, form_options) do |f|
  f.text_field :tags
end

我的文本框被创建,但充满了类似的东西#<Tag:0xb79fb584>#<Tag:0xb79faddc>,这显然不是我想要的。

我知道我可以to_s向 Tag 添加一个方法:

class Tag < ActiveRecord::Base
  def to_s
    name # the name of the tag
  end
end

但这只是给我留下了类似的东西,tag-1tag-2因为@entry.tags.to_s仍然只是指Array#to_s.

现在,我正在使用

f.text_field :tags, :value => @entry.tags.map(&:name).join(", ")

相反,它将显示正确的字符串,但感觉不像是做事的“导轨方式”。有没有办法可以to_s专门为我的tags关联添加自定义方法?

4

2 回答 2

3

有点骇人听闻,但你可以

alias_method_chain :tags, :fancy_to_s
def tags_with_fancy_to_s
  assoc = tags_without_fancy_to_s
  def assoc.to_s; map(&:name).join(", "); end
  assoc
end

应该工作。

或者,您可以只创建方法“tags_string”并让它做同样的事情,而不会滥用对象系统/维护编码人员的大脑。

于 2009-07-08T18:56:51.770 回答
1

有一个更好的方法可以做到这一点:虚拟属性。这个例子准确地展示了如何使用虚拟属性来处理标签关联。

于 2009-07-08T19:45:21.157 回答