#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
В моем приложении Rails 3 я хочу разрешить пользователю указывать, какие части его профиля могут быть доступны для поиска другими. Я знаю, как это сделать, если бы я хотел сделать всего пользователя невидимым, но как я могу настроить его так, чтобы несколько полей можно было назначать для поиска или нет отдельно?
Подробная информация:
С точки зрения функциональности я хочу ограничить поиск в зависимости от того, какие части своего профиля пользователь выбирает для поиска /settings
. Части профиля будут, например, @user.profile.hometown
или @user.profile.current_city
. Я работаю над комбинацией Railscasts # 52 и учебника Тревора Терка, чтобы установить, что другие могут искать с помощью флажков в настройках.
Когда в настройках задана возможность поиска, когда пользователь выполняет поиск (или фильтрует) по /users
индексу, то, что не скрыто, будет общедоступным и доступным для поиска. С точки зрения того, как это работает в БД, что касается скрытия столбцов таблицы или группировки, я думал о скрытии таблиц, но, возможно, это не лучшее решение. Я настолько новичок, насколько это возможно, и, честно говоря, не особо задумывался об этом.
Комментарии:
1. Информация добавлена к вопросу! Сейчас я удалю свои комментарии.
Ответ №1:
Метод 1 — показать / скрыть определенные столбцы
Итак, самый прямой способ (и это сработает, если вы хотите показать / скрыть только несколько вещей) — это просто создать логический столбец для каждой вещи, которую вам нужно показать / скрыть. Итак, если у вас есть поле с номером телефона, у вас может быть столбец с именем «show_phone_number», и при значении true он будет отображаться.
Метод 2 — показывать / скрывать целые разделы
Следующий уровень, который вам может понадобиться, это вместо отображения / скрытия определенных столбцов отображать / скрывать логические столбцы, например show_contact_info
, show_photos
, и т.д. для каждого логического раздела, который пользователь будет показывать или скрывать.
Тогда, на ваш взгляд, у вас будет что-то вроде:
app/views/user/show.html.erb
(или .haml
или что бы вы ни использовали)
....
<% if @user.show_contact_info %>
<%= render :partial => "user_contact_info", :locals => {:user => @user} %>
<% end %>
app/views/partials/_user_contact_info.html.erb
<%=h user.email %><br />
<%=h user.phone_number %><br />
<%= user.blog_url %><br />
...
Метод 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 amp;amp; is_friends_with(visibility.user)
end
def can_see_because_i_follow(visibility)
visibility.is_follower amp;amp; is_follower_of(visibility.user)
end
end
Затем класс называется 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 amp;amp; !is_friend amp;amp; !is_follower
end
end
Затем таблица называется 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"
Затем в вашем контроллере что-то вроде:
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
...
И на ваш взгляд:
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 %>
...
Комментарии:
1. Вау, нагрузки для переваривания. Большое спасибо!