我有一个Entry
模型has_many :tags
。我希望能够在文本输入中列出我的标签(即“tag-1,tag-2”等),但是,我遇到了一个问题。
如果我只是使用
form_for(:entry, form_options) do |f|
f.text_field :tags
end
我的文本框已创建,但填充了类似#<Tag:0xb79fb584>#<Tag:0xb79faddc>
的内容,这显然不是我想要的内容。
我知道我可以在Tag中添加to_s
方法:
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
方法?
答案 0 :(得分: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”并让它在不滥用对象系统/维护编码器的大脑的情况下执行相同的操作。
答案 1 :(得分:1)
有一种更好的方法:虚拟属性。 This example显示了如何使用虚拟属性处理标记关联。