我有一些用户,可以有很多帖子,每个帖子都可以包含多个标记。我已经实现了使用帖子和标签之间的 has_and_belongs_to_many 关系。
创建新帖子时,用户可以使用逗号分隔的值列表对其进行标记(就像在SO上发布新问题时一样)。如果任何标签不存在,则应自动创建。这是帖子的 _fields.html.erb 部分:
<%= form_for @post do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<h1 class="post"><%= t(:new_post_message) %></h1>
<div class="field">
<%= f.label t(:title) %>
<br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label t(:tag).pluralize %>
<br />
<%= f.text_field :tags %>
</div>
<div class="field">
<%= f.label t(:text) %>
<br />
<%= f.text_area :content %>
</div>
<div class="actions">
<%= f.submit t(:post_verb) %>
</div>
<% end %>
立即使用 f.text_field:tags 会为文本生成带 [] 的输入元素。
我还没有在 posts_controller.rb 中使用标签,因为我不确定如何从参数中获取并拆分字符串值:
def create
@post = current_user.posts.build(params[:post])
if @post.save
redirect_to root_path
else
@stream = []
render 'pages/home'
end
end
以前有人解决过这个问题吗?非常感谢。
答案 0 :(得分:23)
我的偏好是在post.model上创建一个属性来读取标签。 e.g。
应用/模型/ post.rb 强>
def tag_list
self.tags.map { |t| t.name }.join(", ")
end
def tag_list=(new_value)
tag_names = new_value.split(/,\s+/)
self.tags = tag_names.map { |name| Tag.where('name = ?', name).first or Tag.create(:name => name) }
end
然后在您看来,您可以这样做:
<%= f.text_field :tag_list %>
而不是:tags
post模型将接受标记列表,拆分为标记名称,找到标记(如果存在),如果不存在则创建标记。无需控制器逻辑。
编辑这段代码当然依赖于您的标签模型,该模型具有名为name的属性(如果不只是替换您存储标签名称的任何属性),并且它在数据库(即您在标签模型中使用validates_uniqueness_of :name
之类的东西)