Система комментирования для RoR Blogging Platform - PullRequest
2 голосов
/ 09 мая 2011

Я пытаюсь создать систему комментариев для моего сайта блогов RoR, и у меня возникли некоторые концептуальные проблемы с архитектурой. Что касается моделей, у меня есть посты, пользователи и комментарии.

  • A Пользователь has_many Blogposts
  • A Блог-пост принадлежит_ одному Пользователь
  • A Blogpost has_many Комментарии
  • A Комментарий может принадлежать или не принадлежать зарегистрированному пользователю (я хочу, чтобы люди, не зарегистрированные на сайте, также могли оставлять комментарии).

У меня такой вопрос: чтобы обеспечить связь между комментарием и постом в блоге, я создаю каждый новый комментарий ( @ comment ) с помощью ассоциации блогов (@blogpost.comments.build). (: арг)). Однако я не знаю, как связать конкретного зарегистрированного пользователя с его / ее комментарием. Я оставил атрибут user_id OUT attr_accessible для модели Comment , потому что хотел предотвратить возможность того, что люди приписывают комментарии не тем пользователям.

Есть идеи, как лучше всего реализовать систему комментирования с таким отношением? Большое спасибо заранее!

Ответы [ 4 ]

1 голос
/ 09 мая 2011

Вы можете просто иметь ассоциацию:

User has_many comments through blog_posts

Итак, теперь вы можете сделать:

current_user.comments

Еще один способ сделать это через blog_post:

current_user.blog_post.comments

Кроме того, вы можете использовать красивый плагин act_as_commentable:)

https://github.com/jackdempsey/acts_as_commentable

1 голос
/ 09 мая 2011

Предполагая, что:

User has_many comments
Comment belongs_to user

В вашем контроллере при сохранении комментария вы можете просто сделать:

@comment.user = current_user if current_user
@comment.save

Если комментарий сделан незарегистрированным пользователем @comment.user просто остается пустым.

0 голосов
/ 09 мая 2011

Вы можете добавить связь между Комментарием и Пользователем, а затем создать комментарий с помощью current_user:

# User.rb
has_many :comments

# Comment
belongs_to :user

Установка ассоциаций только действительно добавляет методы связи, поэтому нет проблем с созданием Комментария без регистрациив пользователя.Вы не хотите строить комментарий для current_user как current_user.comments.create(...), потому что это приведет к ошибке NilClass, если никто не вошел в систему.

@user = current_user # @user should be nil if commenter is not logged in
# be fancy and use a block
@blogpost.comments.create(params[:comment]) do |c|
  c.user = @user
end

Пока проверка пользователя в комментарии отсутствует, ноль пользователь должен просто пройти без проблем.

0 голосов
/ 09 мая 2011

Нет необходимости указывать user_id как attr_accessible , если у вас есть доступ к зарегистрированному в данный момент пользователю в ваших методах сохранения или добавления новых комментариев.

Если они не вошли в систему, то вы ожидаете, что текущий пользователь будет пустым / ложным.

Это должно быть доступно, если вы используете какие-либо плагины аутентификации, такие как authlogic или devise. По моему опыту с authlogic у вас обычно есть метод current_user в вашем ApplicationController.

class ApplicationController
helper_method :current_user_session, :current_user

private
  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.user
  end
end

Выше кода из быстрого примера Authlogic

...