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,

War es hilfreich?

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])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top