Как вы используете якоря для идентификаторов в маршрутах в Rails 3?

Представьте себе блог с posts и comments. URL-адрес отдельного комментария может быть posts/741/comments/1220.

Однако я хотел бы сделать URL-адрес posts/741#1220 или даже posts/741#comment-1230.

Какой наименее навязчивый способ сделать это, чтобы redirect_to comment_path(my_comment) указывал на правильный URL?


person ClosureCowboy    schedule 12.02.2011    source источник


Ответы (2)


Вы можете просто использовать

redirect_to post_path(comment.post, :anchor => "comment-#{comment.id}")

чтобы вручную создать URL-адрес с якорем. Таким образом, вы все еще можете иметь абсолютный URL-адрес ваших комментариев как posts/:post_id/comments/:comment_id в своих маршрутах. Вы также можете создать вспомогательный метод, например. application_controller.rb

class ApplicationController
  helper :comment_link

  def comment_link(comment)
    post_path(comment.post, :anchor => "comment-#{comment.id}")
  end
end
person Holger Just    schedule 12.02.2011
comment
Какая польза от того, что мой абсолютный URL по-прежнему будет post/:post_id/comments/:comment_id? - person ClosureCowboy; 13.02.2011
comment
@ClosureCowboy: вы все равно можете правильно определить комментарии как ресурсы, например. удалить или отредактировать их. Это зависит от ваших реальных требований, имеет ли это смысл иметь или нет. - person Holger Just; 13.02.2011
comment
Является ли контроллер лучшим местом для размещения такого помощника? Я сам обдумываю эту проблему, и я действительно не знаю, где разместить всех моих помощников по якорным ссылкам. - person Alexander Kuzmin; 19.11.2013
comment
@AlexanderKuzmin Вы также можете поместить его во вспомогательный модуль. Если вы не используете вспомогательный метод в действии контроллера, тогда все в порядке. В противном случае вам придется включить вспомогательный модуль в класс вашего контроллера, используя helper MyControllerHelper. - person Holger Just; 19.11.2013

Предпочитаю хранить свой конструктор якорей в одном месте.

class Comment
  ...
  def anchor
    "comment-#{id}#{created_at.to_i}"
  end
end

тогда

post_path(comment.post, :anchor => comment.anchor)

Добавление created_at.to_i немного скрывает ваши данные и ничему не вредит.

person Blair Anderson    schedule 15.03.2017