Как создать якорь и перенаправить на этот конкретный якорь в Ruby on Rails

Я пытаюсь создать уникальные якоря для каждого комментария в моем блоге, чтобы человек мог взять 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 ответов

Решение

Похоже, вы хотите использовать 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 предназначен для этого тега.

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

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

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

link_to "Comment wall", profile_path(@profile, :anchor => "wall")
       # => <a href="/profiles/1#wall">Comment wall</a>

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

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

Или же

<%= link_to '#', post_path(comment.post, anchor: dom_id(comment)) %>

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

<%= link_to '#', post_path(comment.post, anchor: dom_id(comment.id)) %>

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

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

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

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

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

Другие вопросы по тегам