Как создать якорь и перенаправить на этот конкретный якорь в Ruby on Rails - PullRequest
37 голосов
/ 17 апреля 2009

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

Возможно, я поступаю неправильно, но я пробовал это, но безрезультатно.

Просмотр комментариев - Ошибка 1 - при вставке в браузер эта ссылка не прокручивается вниз до нужной позиции

<%= link_to '#', :controller => 'posts', :action => 'show', :id => comment.post, :anchor => 'comment_' << comment.id.to_s %>

Контроллер комментариев - Ошибка 2 - Исправьте URL в браузере, но прокрутка не происходит, он просто остается в верхней части страницы

redirect_to :controller => 'posts', :action => 'show', :id => @post, :anchor => 'comment_' + @comment.id.to_s

Если бы кто-то мог помочь, я был бы очень благодарен:)

ОБНОВЛЕНИЕ: Решения, представленные ниже, почти работают, однако я получаю следующий URL, который не будет прокручен, если я нажму на него.

# т.е. http://localhost:3000/posts/please-work

Ответы [ 6 ]

80 голосов
/ 17 апреля 2009

На самом деле, якорь - это опция для пути, а не для link_to

<%= link_to '#', post_path(comment.post, :anchor => "comment_#{comment.id}") %>

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#M001565

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
       # => <a href="/profiles/1#wall">Comment wall</a>
5 голосов
/ 17 апреля 2009

Похоже, вы хотите использовать код link_to, который у вас есть в вашем вопросе. Затем в своем списке комментариев вы должны убедиться, что у вас есть якорный тег, названный той же самой ссылкой.

Итак, это:

 <%= link_to 'Your comment', post_path(@comment.post) + "#comment_#{@comment.id.to_s}" %>

сгенерирует что-то вроде этого

 <a href="localhost:3000/posts/2#1comment_234">Your comment</a>

 /* html code */     

 <a name="comment_1234">This is a comment</a>

Вы должны вручную указать #comment_, иначе метод link_to считает, что передаваемый им атрибут: anchor предназначен для этого тега.

1 голос
/ 05 июня 2014

Вот улучшение ответа @ XGamerX.

<%= link_to '#', [comment.post, { anchor: dom_id(comment) }] %>

Или

<%= link_to '#', post_path(comment.post, anchor: dom_id(comment)) %>
0 голосов
/ 21 февраля 2017

это лучший способ:

<%= link_to '#', post_path(comment.post, anchor: dom_id(comment.id)) %>
0 голосов
/ 17 апреля 2009

Эти ссылки будут прокручиваться вниз до позиции, где у вас есть код, такой как:

<a name="comment_1"></a>

Я не знаю, есть ли помощники, которые сделают это за вас, но это очень просто, и вы можете написать свой собственный.

0 голосов
/ 17 апреля 2009

Попробуйте это:

<%= link_to '#', post_path(comment.post), :anchor => "comment_#{comment.id}" %>
...