Ruby/Rails — Разбиение на страницы вложенных ресурсов AJAX — Как определить родительский ресурс?

В моей модели есть Posts, Users и Comments. Пользователи могут оставлять комментарии к сообщениям или о них. Каждый комментарий принадлежит Пользователю и Сообщению. Таким образом, модель Comment имеет поле user_id и поле post_id.

При просмотре Post я хочу разбить на страницы комментарии этого поста.
При просмотре User я хочу разбить на страницы комментарии этого пользователя.
Я хочу разбить на страницы с помощью AJAX (через драгоценный камень Kaminari).

У меня есть вложенные маршруты, настроенные для обоих.

В публикации URL-адрес – http://localhost:3000/posts/{:id}/comments?page={page_number}
Для пользователя – URL-адрес http://localhost:3000/users/{:id}/comments?page={page_number}

Оба URL-адреса попадают в действие index контроллера комментариев.

Мой вопрос заключается в следующем: внутри действия index как мне определить, является ли предоставленное {:id} user_id или post_id, чтобы я мог получить нужные комментарии.


person johnnycakes    schedule 30.05.2011    source источник
comment
Вы можете проверить это с помощью регулярного выражения, например, в request.env[HTTP_REFERRER]. Если есть совпадение пользователей, то :id принадлежит пользователю и наоборот   -  person bor1s    schedule 30.05.2011


Ответы (2)


Проверьте наличие params[:user_id] и params[:post_id] в вашем контроллере комментариев:

if params[:user_id]
  #call came from /users/ url
elsif params[:post_id]
  #call came from /posts/ url
else
  #call came from some other url
end
person Zabba    schedule 30.05.2011
comment
Этих идентификаторов родительских ресурсов нет, или это кажется неверным в Rails 4, по крайней мере, в приложении, которое я создал. - person SWoo; 08.11.2013

Мне нравится стиль Райана Бейтса

class CommentsController
  before_action :load_commentable

  def index
    @comments = @commentable.comments.page(params[:page])
  end

  private

    def load_commentable
      klass = [Post, User].detect { |c| params["#{c.name.underscore}_id"] }
      @commentable = klass.find(params["#{klass.name.underscore}_id"])
    end
end
person deivid    schedule 06.03.2014