【问题标题】:How-to user has many privacy settingsHow-to 用户有许多隐私设置
【发布时间】:2010-11-17 12:35:51
【问题描述】:

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

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

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

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"=>["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) 最后,我从参数中删除通知数组,否则我的表单无法正确保存。

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

你有什么想法?

之后,

【问题讨论】:

  • 顺便说一句,上面的实现有效。我只是想看看我是否做得对,或者是否有更清洁的方法

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

看起来不错。你可以稍微清理一下,但不会有太大区别。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2011-07-16
    • 2022-12-02
    • 2011-03-15
    相关资源
    最近更新 更多