操作方法用户有许多隐私设置

时间:2010-11-17 12:35:52

标签: ruby-on-rails mongodb mongoid

我有用户设置的隐私设置。隐私设置可以是这样的:

  • 不要在公共时间轴上显示我的更新
  • 不要显示我的电子邮件地址
  • 不显示我的出生日期

我想过在用户集中嵌入了隐私设置。

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"}

从上面可以看出。它将通知ID作为数组提交:“notifications”=&gt; [“4ce3c66872357e0a95000011”,“4ce3c66872357e0a95000012”]}

在我的用户控制器中,更新方法。我有:

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)之后,我正在查看所有通知ID的参数并将每个通知ID设置为:is_active为true。

3)最后,我从params中删除了notifications数组,否则我的表单无法正常保存。

是否有更好/更清洁的方式让它与Mongoid一起使用?或者,是否有更好的方法来设计它?我在考虑使用多对多而不是嵌入式。

你有什么想法?

之后,

1 个答案:

答案 0 :(得分:0)

看起来很好。你可以稍微清理它,但它不会有太大的区别。

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