Rails 3 вложенных ресурса со структурой пользователей (Devise)

У меня общие структурные проблемы с Rails 3, и новый routes.rb немного сбивает меня с толку. Спасибо за любую помощь или руководство.

У меня есть приложение для форума с вложенными ресурсами. Есть разделы, темы и ответы. Структура routes.rb выглядит так:

resources :sections do
   resources :topics do
     resources :replies
   end
end

Мой section.rb:

  has_many :topics
  has_many :replies, :through => :topics

Мой topic.rb:

  belongs_to :section
  has_many :replies

Мой reply.rb:

  belongs_to :topic

И это прекрасно работает. Вот где я запутался.

Я добавил пользовательский контроллер с помощью Devise, и у меня есть работающая система входа / выхода по имени пользователя. Я пытаюсь связать current_user с ответами и темами. Думаю, у меня есть хорошее представление о том, как исправить модели, но я очень запутался в том, что делать в файле routes.rb.

Я считаю, что для user.rb мне нужно добавить has_many: themes и has_many: answers,: through =>: themes. И тогда в моих темах мне нужно добавить "own_to: user". Я считаю, что reply.rb остался прежним?

Что касается routes.rb, я немного в тупике. Если я отредактирую маршруты и добавлю к ним пользователей, я получу такой путь, как sectionid / username / topicid /, но мне не обязательно хранить имя пользователя в таком маршруте. Так что я вкладываю пользователя между разделами и темами или могу оставить пользователя вне файла routes.rb.


person a3uge    schedule 06.04.2011    source источник


Ответы (1)


Вы можете оставить пользователей в стороне. Просто включите devise_for: users поверх ваших маршрутов, не включая его в блок ресурсов.

У пользователя много тем и много ответов. И темы, и ответы принадлежат пользователю.

Требуются дополнительные изменения в ваших контроллерах. Вам необходимо добавить before_filter, чтобы проверить, аутентифицированы ли пользователи, и, кроме того, внести изменения в большинство методов вашего контроллера, чтобы проверить, аутентифицированы ли пользователи не только, но и авторизованы, например для поиска редактирования вы выполняете current_user.replies ..... Вы можете прочитать об этом здесь (моя собственная страница): http://www.communityguides.eu/articles/4.

person Markus Proske    schedule 06.04.2011
comment
Итак, в моем контроллере тем, когда я создаю, где мне указать его пользователя? Могу ли я использовать before_filter и иметь ли метод «@user = current_user», и сохранит ли это пользователя при создании новой темы? Или мне нужно отредактировать метод создания? - person a3uge; 06.04.2011
comment
Я так понимаю, мне нужно сделать что-то вроде ... @topic = section.current_user.topics.build (params [: topic]) ... но, очевидно, не работает, потому что current_user не является свойством section. - person a3uge; 06.04.2011
comment
current_user - помощник Devise. Он равен нулю, если ни один пользователь не вошел в систему, а объект пользователя, если пользователь вошел в систему. В вашем фильтре before вам нужно что-то вроде этого: before_filter: Authenticate_user !,: except = ›[: index]. Это потребует входа для всех методов этого контроллера, кроме index. Взгляните на мою ссылку (и другие главы учебника). - person Markus Proske; 06.04.2011
comment
У меня уже есть базовая аутентификация. У меня проблемы с методом создания и с тем, как его структурировать. В моем контроллере тем в моем методе создания у меня есть что-то вроде @topic = current_user.topics.new (params [: topic]), но тогда тема не знает, что это за раздел. Мне нужен пользователь, тема, раздел и содержание темы в базе данных. - person a3uge; 06.04.2011
comment
Это зависит от ваших настроек в моделях. Если у вас есть темы пользователя own_to и пользователя has_many, вы можете получить доступ к current_user.topics. Помните, current_user - это просто пользовательский объект. Что вам понадобится, так это метод build, чтобы построить отношения, а затем связать их вместе и сохранить в базе данных. Другой пример метода обновления, при котором у пользователя есть статьи, у статей есть комментарии, а комментарии привязаны к пользователям: @article = Article.find(params[:article_id]) @comment = @article.comments.build(params[:comment]) @comment.user = current_user @comment.save - person Markus Proske; 06.04.2011
comment
@MarkusProske ссылка не работает. - person HM1; 27.06.2013