1

我有以下模型:

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]]] 感觉很尴尬,有没有更好的写法?

同样在我的路线中,为了打破我拥有的标签字符串并将其作为单独的嵌入文档存储回哈希结构,然后再保存。我觉得这是解析这些信息的一种非常迂回的方式。

处理此问题的最佳做法是什么?

4

1 回答 1

1

哈姆

%input{name: 'entry[tags_attributes][][tag]', value: t.tag}

路线简单

post '/portofolio/new' do
  Entry.new(params[:entry])
  ...
end

注意编辑/放置不要忘记嵌入的ID

%input{type: 'hidden', name: 'entry[tags_attributes][][id]', value: t.id}
于 2012-04-27T01:55:43.640 回答