如何使个人资料的某些部分可搜索或不可搜索

tva*_*nt2 2 ruby-on-rails-3

在我的 Rails 3 应用程序中,我希望允许用户指定其他人可以搜索他们个人资料的哪些部分。如果我想让整个用户不可见,我知道如何执行此操作,但是如何设置以便可以将多个字段指定为可搜索或不可单独搜索?

更多信息:

在功能方面,我想根据用户选择在/settings. 例如,配置文件的某些部分将是@user.profile.hometown@user.profile.current_city。我正在结合Railscasts #52Trevor Turk 的教程来设置其他人可以通过设置中的复选框搜索的内容。

在设置中定义可搜索性后,当用户搜索(或过滤)/users索引时,未隐藏的内容将是公开的和可搜索的。就隐藏表列或分组而言,这在数据库中是如何工作的,我考虑过隐藏表,但这可能不是最好的解决方案。我是初学者,老实说并没有真正考虑过这个问题。

jef*_*unt 5

方法 1 - 显示/隐藏特定列

因此,最直接的方法(如果您只想显示/隐藏少量内容,这将起作用),就是为您需要显示/隐藏的每个内容创建一个布尔列。所以,如果你有一个电话号码字段,你可以有一个名为“show_phone_number”的列,当为真时它会显示它。

方法 2 - 显示/隐藏整个部分

一个新的水平,你可能需要的,而不是显示/隐藏特定列,有你的显示/隐藏布尔柱像show_contact_infoshow_photos等每个逻辑部分,用户将显示或隐藏。

然后在你看来,你会有类似的东西:

app/views/user/show.html.erb(或.haml或您正在使用的任何东西)

....
<% if @user.show_contact_info %>
  <%= render :partial => "user_contact_info", :locals => {:user => @user} %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

app/views/partials/_user_contact_info.html.erb

<%=h user.email %><br />
<%=h user.phone_number %><br />
<%=  user.blog_url %><br />
...
Run Code Online (Sandbox Code Playgroud)

方法 3 - 根据查看者显示/隐藏部分

最后(这里的代码未经测试,但我认为您会明白)假设您的站点具有社交结构,并且您想向某些人显示信息,但不向其他人显示信息。基本上,您需要某种形式的以下内容:

  • 部分可见性(谁可以查看哪些部分)
  • 角色(朋友、关注者、公共、私人)
  • 使这些关系清晰/易于理解的几种方法

所以,在你的User模型中,你会有类似的东西:

class User < ActiveRecord::Base
  has_many :friends, :through => "friendships"  # or whatever construct you have
  has_many :followers, :through => "followings" # or whatever construct you have
  has_many :profile_visibilities
  ...

  def is_friends_with(user)
    friends.include?(user)
  end

  def is_a_follower_of(user)
    user.followers.include?(self)
  end

  def can_see(visibilities)
    visibilities.each do |v|
      v.user == self || v.is_public || can_see_because_we_are_friends(v) || can_see_because_i_follow(v)
    end
  end

  private:
  def can_see_because_we_are_friends(visibility)
    visibility.is_friend && is_friends_with(visibility.user)
  end

  def can_see_because_i_follow(visibility)
    visibility.is_follower && is_follower_of(visibility.user)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后是一个名为ProfileVisibilities

class  ProfileVisibilities < ActiveRecord::Base
  belongs_to :user
  ...

  def is_public
    visibility == "public"
  end

  def is_friend
    visibility == "friends"
  end

  def is_follower
    visibility == "followers"

  def is_private
    !is_public && !is_friend && !is_follower
  end
end
Run Code Online (Sandbox Code Playgroud)

然后一个表叫 profile_visibilities

id  | user_id | profile_section | visibility
----------------------------------------------
1   | 1       | contact_info    | public        # <= visible to everyone
2   | 1       | personal_info   | friends       # <= visible only to "friends"
3   | 1       | blog_posts      | friends       # <= visible to "friends"
4   | 1       | blog_posts      | followers     # <= ...and followers
5   | 1       | photos          | friends       # <= visible only to "friends"
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器中,类似于:

app/controllers/users_controller.rb

...
def show
  @user = User.find(params[:id])
  @contact_info_visibilities = ProfileVisibilities.find(:all, :conditions = ['user_id = ? AND profile_section = "contact_info"', @user.id]
  @photo_visibilities = ProfileVisibilities.find(:all, :conditions = ['user_id = ? AND profile_section = "photos"', @user.id]
  # ... and more for each section visibility you need
end
...
Run Code Online (Sandbox Code Playgroud)

在你看来:

app/views/user/show.html.erb

...
<% if current_user.can_see(@contact_info_visibilities) %>
  <%= render :partial => "user_contact_info", :locals => {:user => @user}
<% end %>

<% if current_user.can_see(@photo_visibilities) %>
  <%= render :partial => "user_photos", :locals => {:user => @user}
<% end %>
...
Run Code Online (Sandbox Code Playgroud)