У меня есть настройки конфиденциальности для пользователей. Настройки конфиденциальности могут быть такими:
- Не показывать мои обновления в общедоступной хронике
- Не показывать мой адрес электронной почты
- Не показывать дату моего рождения
Я подумал о том, чтобы встроить параметры конфиденциальности в коллекцию User.
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) Наконец, я удаляю массив уведомлений из параметров, иначе моя форма не сохраняется должным образом.
Есть ли лучший/чистый способ заставить это работать с Mongoid? Или, возможно, есть лучший подход к разработке этого? Я думал об использовании многие ко многим вместо встроенных.
Что ты думаешь?
После,