O usuário de instruções tem muitas configurações de privacidade
-
25-09-2019 - |
Pergunta
Tenho configurações de privacidade para os usuários definirem. As configurações de privacidade podem ser como tais:
- Não mostre minhas atualizações sobre a linha do tempo pública
- Não mostre meu endereço de e -mail
- Não mostre minha data de nascimento
Pensei em ter configurações de privacidade incorporadas na coleção de usuários.
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
Meu formulário parece:
<%= 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 %>
Quando o formulário envia. Tem os seguintes parâmetros:
{"utf8"=>"✓", "_method"=>"put",
"authenticity_token"=>"FQvGlJ8p+SPX8MIQqMjS04tHVLQ4jEl31tpAoKwGYDE=", "user"=>{"city_id"=>"",
"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}, "action"=>"update",
"controller"=>"users", "id"=>"1234"}
Como você pode ver de cima. Está enviando os IDs de notificação como uma matriz: "Notificações" => ["4CE3C66872357E0A95000011", "4CE3C66872357E0A95000012"]}
No meu controlador de usuários, o método de atualização. Eu tenho:
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
Meu método de atualização parece um pouco confuso, porque:
1) Estou redefinindo todas as caixas de seleção por configuração: is_active para false.
2) Depois, estou analisando os parâmetros para todos os IDs de notificação e definindo cada um: is_active como true.
3) Finalmente, removo a matriz de notificações dos parâmetros, caso contrário, meu formulário não salva corretamente.
Existe uma maneira melhor / mais limpa de fazer isso funcionar com o Mongoid? Ou talvez, exista uma abordagem melhor para projetar isso? Eu estava pensando em usar muitos para muitos em vez de incorporado.
Quais são seus pensamentos?
Depois,
Solução
Parece bem. Você pode limpá -lo um pouco, mas não fará muita diferença.
Ou seja
# 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])