Как пользователь имеет много настроек конфиденциальности - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть настройки конфиденциальности для пользователей.Настройки конфиденциальности могут быть такими:

  • Не показывать мои обновления на общедоступной временной шкале
  • Не показывать мой адрес электронной почты
  • Не показывать дату моего рождения

Я думал о том, чтобы встроить настройки конфиденциальности в коллекцию пользователей.

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?Или, может быть, есть лучший подход к разработке этого?Я думал о том, чтобы использовать многие ко многим вместо встроенных.

Что вы думаете?

После,

1 Ответ

0 голосов
/ 22 ноября 2010

выглядит хорошо.Вы можете почистить это немного, но это не будет иметь большого значения.

Т.е.

# 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])
...