如何将锚添加到redirect_to:back

时间:2012-12-10 01:20:04

标签: ruby-on-rails anchor

我有一个博客应用程序,其帖子可以通过帖子控制器中的vote操作接收投票。 因为我允许在索引和节目视图中进行投票,所以在投票后我redirect_to :back,如下所示。

def vote
  # voting logic goes here
  redirect_to :back
end

这会将我重定向到正确的页面,但我想重定向到页面中的特定帖子。为此,我在帖子部分div中添加了一个识别锚点。

<div id="post_<%= post.id %>">
  <%= post.content %>
</div>

如何在redirect_to :back中引用此内容?我尝试了以下,但是没有用。

# this doesn't work!
redirect_to :back, anchor: "post_#{@post.id}"

或者,如果我对show和index视图使用if子句,我该怎么做?我尝试了以下内容,返回undefined method 'current_page' for VocabsController

#this doesn't work!
if current_page?(posts_path)
  redirect_to posts_path(anchor: "post_#{@post.id}"
else
  redirect_to @post
end

4 个答案:

答案 0 :(得分:12)

Deep in Rails重定向机制,:back只是意味着重定向到HTTP_REFERER环境变量中的任何内容(如果此变量中没有任何内容,则引发错误)。因此,在控制器redirect_to :back之前添加以下行:env["HTTP_REFERER"] += '#some-id',这应该是这样做的。

答案 1 :(得分:1)

编辑:好吧,我的坏,感到困惑。你应该看看这个:

What's the right way to define an anchor tag in rails?

EDIT2:

你遇到的问题是你在控制器内部而不是在视图内部调用帮助器。

我建议您查看view_context方法

http://jhonynyc.tumblr.com/post/5361328463/use-view-context-inside-rails-3-controller

答案 2 :(得分:0)

我最终使用的是Javascript。

posts_controller.rb

def vote
  @post = Post.find(params[:id])
  #voting logic
  respond_to do |format|
    format.html { redirect_to :back }
    format.js
  end
end

文章/ _post.html.erb

<div class="post_partial" id="post_<%= post.id %>">
  <%= post.content %>
  <div id="vote_button_<%= post.id %>">
    <%= link_to "up", vote_path, method: "post", remote: true %>
  </div>
</div>

文章/ vote.js.erb

$('#post_<%= @post.id %>').html('<%= j render @post %>');

答案 3 :(得分:0)

在后台,redirect_back(fallback_location: 'some_path')重定向到request.referrer,并在出现问题时退回到“ some_path”。

不幸的是,它没有提供锚点。您可以通过编写一个简单的私有方法对其进行仿真来解决此问题。

def back_with_anchor(anchor: '')
  "#{request.referrer}##{anchor}"
end

然后您可以在需要时执行此操作。

redirect_to back_with_anchor anchor: @record.id