У меня есть настройки конфиденциальности для пользователей.Настройки конфиденциальности могут быть такими:
- Не показывать мои обновления на общедоступной временной шкале
- Не показывать мой адрес электронной почты
- Не показывать дату моего рождения
Я думал о том, чтобы встроить настройки конфиденциальности в коллекцию пользователей.
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"}
Как видно из приведенного выше.Он отправляет идентификаторы уведомлений в виде массива: "notifications" => ["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}
В моем контроллере Users, метод обновления.У меня есть:
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) После этого я просматриваю параметры всех идентификаторов уведомлений и устанавливаю для каждого из них: is_active в true.
3) Наконец, я удаляю массив уведомлений из params, иначе моя формане сохраняется должным образом.
Есть ли лучший / более чистый способ заставить это работать с Mongoid?Или, может быть, есть лучший подход к разработке этого?Я думал о том, чтобы использовать многие ко многим вместо встроенных.
Что вы думаете?
После,