在Sinatra上持有Haml的mongoid父文件和嵌入式文件

时间:2012-04-26 14:25:19

标签: sinatra mongoid haml

我有以下型号:

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帖子信息,并且能够(几乎立即)将其保存到mongodb。

将输入值放在散列的正确位置的haml方法是我发现通过反复试验的方法。但它并不觉得DRY,肯定有更好的方法来编写嵌入式文档?特别是条目[tags_attributes [0 [tag]]]感觉很尴尬,有没有更好的方法来写这个?

同样在我的路线中,为了打破我拥有的标签串并在保存之前将其作为单独的嵌入文档存储回哈希结构中。我觉得解析这些信息非常简单。

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

1 个答案:

答案 0 :(得分:1)

Haml的

%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}