Der Benutzer hat viele Datenschutzeinstellungen
-
25-09-2019 - |
Frage
Ich habe Datenschutzeinstellungen, die Benutzer festlegen können. Datenschutzeinstellungen können als solche sein:
- Zeigen Sie meine Updates über die öffentliche Zeitleiste nicht
- Zeigen Sie meine E -Mail -Adresse nicht an
- Zeigen Sie mein Geburtsdatum nicht
Ich dachte daran, Datenschutzeinstellungen in die Benutzersammlung eingebettet zu haben.
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
Meine Form sieht aus:
<%= 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 %>
Wenn sich das Formular einreicht. Es hat die folgenden Parameter:
{"utf8"=>"✓", "_method"=>"put",
"authenticity_token"=>"FQvGlJ8p+SPX8MIQqMjS04tHVLQ4jEl31tpAoKwGYDE=", "user"=>{"city_id"=>"",
"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}, "action"=>"update",
"controller"=>"users", "id"=>"1234"}
Wie Sie von oben sehen können. Es gibt die Benachrichtigungs -IDs als Array ein: "Benachrichtigungen" => ["4ce3C66872357E0A95000011", "4CE3C66872357E0A95000012"]}
Aktualisieren Sie in meinem Benutzer Controller die Methode. Ich habe:
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
Meine Update -Methode sieht ein bisschen chaotisch aus, weil:
1) Ich setze alle Kontrollkästchen durch Einstellung zurück: is_active zu false.
2) Danach schaue ich nach den Params nach allen Benachrichtigungs -IDs und setze die einzelnen fest: is_active to true.
3) Schließlich entferne ich das Benachrichtigungsarray aus Params, sonst speichert mein Formular nicht ordnungsgemäß.
Gibt es eine bessere / sauberere Möglichkeit, dies mit Mongoid zu arbeiten? Oder gibt es vielleicht einen besseren Ansatz, dies zu entwerfen? Ich dachte darüber nach, viele zu viele zu viel zu verwenden, statt eingebettet zu sein.
Was sind deine Gedanken?
Nach,
Lösung
Sieht gut aus. Sie könnten es ein wenig aufräumen, aber es macht keinen großen Unterschied.
Dh
# 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])