我有一个List模型。列表中嵌入了标签(使用Mongoid)。当用户创建列表时,他可以通过文本字段中的逗号分隔列表指定相关标签。accep_nested_attributes_for:tags?通过关联分割和存储逗号分隔标签
如何通过List关联存储标签?我可以使用List模型中的accepts_nested_attributes_for:tags来做到吗,还是必须预先处理标签字符串?
这是我到目前为止。如何处理标记字符串,将其拆分并将每个标记单独存储在列表中的嵌入标记文档中?
列表控制器:
class ListsController < ApplicationController
def new
@list = List.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @list }
end
end
def create
list_params = params[:list]
list_params[:user_id] = current_user.id
@list = List.new(list_params)
if @list.save
redirect_to @list, notice: 'List was successfully created.'
else
render action: "new"
end
end
end
列表创建表单
= form_for @list do |f|
- if @list.errors.any?
#error_explanation
%h2= "#{pluralize(@list.errors.count, "error")} prohibited this list from being saved:"
%ul
- @list.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :name
= f.text_field :name
.field
= f.label :description
= f.text_field :description
.field
= f.fields_for :tags do |t|
= t.label :tags
= t.text_field :name
.actions
= f.submit 'Save'
列表模型
class List
include Mongoid::Document
include Mongoid::Timestamps
field :name
field :description
embeds_many :items
embeds_many :comments
embeds_many :tags
belongs_to :user
accepts_nested_attributes_for :tags
标签模型
class Tag
include Mongoid::Document
field :name
has_one :list
end
编辑根据杰夫的建议
列表控制器最终看。
def create
tags = params[:tags][:name]
list = params[:list]
list[:user_id] = current_user.id
@list = List.new(list)
tags.gsub("\s","").split(",").each do |tag_name|
@list.tags.new(:name => tag_name)
end
if @list.save
redirect_to @list, notice: 'List was successfully created.'
else
render action: "new"
end
end
谢谢杰夫,这确实有很大帮助。我发布了一个基于你的帮助的最终解决方案的编辑。非常感激! – aressidi
啊......我的印象是标签已经被创建了。如果您有创建和未创建的标签混合,您可能需要考虑“@ list.tags.find_or_initialize_by_name(tag_name)”。 – Geoff
哦,等等,我认为只能找到现有的标签关联,而不是所有的标签。没关系! – Geoff