我有以下模型:
class Entry
include Mongoid::Document
field :title, type: String
field :description, type: String
field :made, type: Date
embeds_many :images
embeds_many :videos
embeds_many :files
embeds_many :tags
accepts_nested_attributes_for :images, :videos, :files, :tags
validates_presence_of :title, :description, :tags
validates_uniqueness_of :title, :description
end
class Tag
include Mongoid::Document
field :tag, type: String
embedded_in :entry
embedded_in :note
end
发布路线如下所示:
post '/portfolio/new' do
a = (params[:entry])
a['tags_attributes']['0']['tag'].downcase.split(", ").each_with_index{|value, index| a['tags_attributes'][index.to_s] = {"tag" => value} }
b = Entry.new(a)
b.safely.save!
redirect "portfolio/show/#{b._id}"
end
我的haml输入看起来像:
%label{:for => "tags"} Tags:
%input{:name => "entry[tags_attributes[0[tag]]]"}
我是 Ruby/Sinatra/Mongoid 的新手,所以我仍在尝试弄清楚如何正确访问文档属性。
我想做的是处理http post信息并能够(几乎立即)将其保存到mongodb。
将输入值放置在散列上正确位置的 haml 方法是我发现的一种通过反复试验来工作的方法。但它并不觉得 DRY,肯定有更好的方法来编写嵌入文档吗?特别是 entry[tags_attributes[0[tag]]] 感觉很尴尬,有没有更好的写法?
同样在我的路线中,为了打破我拥有的标签字符串并将其作为单独的嵌入文档存储回哈希结构,然后再保存。我觉得这是解析这些信息的一种非常迂回的方式。
处理此问题的最佳做法是什么?