【发布时间】:2010-11-17 12:35:51
【问题描述】:
我有供用户设置的隐私设置。隐私设置可以是这样的:
- 不要在公共时间线上显示我的更新
- 不要显示我的电子邮件地址
- 不要显示我的出生日期
我想在用户集合中嵌入隐私设置。
class User
include Mongoid::Document
include Mongoid::Timestamps
embeds_many :privacies
...
end
class Privacy
include Mongoid::Document
field :title, :type => String
field :description, :type => String
field :is_active, :type => Boolean
embedded_in :user, :inverse_of => :privacies
...
end
我的表格如下:
<%= form_for(@user, :url => user_path(@user)) do |f| %>
<ul>
...
<% @user.notifications.each do |notification| %>
<li>
<%= check_box_tag 'user[notifications][]', notification.id, notification.is_active %>
<%= label_tag notification.description %>
</li>
<% end %>
<li class="clearfix">
<%= image_submit_tag('update.png', :class => 'submit') %>
</li>
</ul>
<% end %>
表单提交时。它有以下参数:
{"utf8"=>"✓", "_method"=>"put",
"authenticity_token"=>"FQvGlJ8p+SPX8MIQqMjS04tHVLQ4jEl31tpAoKwGYDE=", "user"=>{"city_id"=>"",
"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}, "action"=>"update",
"controller"=>"users", "id"=>"1234"}
从上面可以看到。它以数组形式提交通知 ID:"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}
在我的用户控制器中,更新方法。我有:
def update
@user = User.where(:id => params[:id]).first
# Unset all notifications for user
@user.notifications.each do |notification|
notification.update_attributes!(:is_active => false)
end
# Based on the form, set notifications
params[:user][:notifications].each do |notification|
@user.notifications.find(notification).update_attributes!(:is_active => true)
# @user.notifications.first.update_attributes!(:is_active => false)
end
# Remove the notifications from params
params[:user][:notifications] = []
respond_to do |format|
if @user.update_attributes(params[:user])
...
end
end
我的更新方法看起来有点乱,因为:
1) 我通过将 :is_active 设置为 false 来重置所有复选框。
2) 之后,我正在查看所有通知 id 的参数并将每个通知 id 的 :is_active 设置为 true。
3) 最后,我从参数中删除通知数组,否则我的表单无法正确保存。
有没有更好/更清洁的方法让它与 Mongoid 一起使用?或者,有没有更好的方法来设计这个?我正在考虑使用多对多而不是嵌入式。
你有什么想法?
之后,
【问题讨论】:
-
顺便说一句,上面的实现有效。我只是想看看我是否做得对,或者是否有更清洁的方法
标签: ruby-on-rails mongodb mongoid