我有用户设置的隐私设置。隐私设置可以是这样的:
我想过在用户集中嵌入了隐私设置。
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”=&gt; [“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)最后,我从params中删除了notifications数组,否则我的表单无法正常保存。
是否有更好/更清洁的方式让它与Mongoid一起使用?或者,是否有更好的方法来设计它?我在考虑使用多对多而不是嵌入式。
你有什么想法?
之后,
答案 0 :(得分:0)
看起来很好。你可以稍微清理它,但它不会有太大的区别。
即
# loop and set these to false
user.notifications.not_in(:id => params[:user][:notifications])
# loop and set these to true
user.notifications.any_in(:id => params[:user][:notifications])