9

我有一个博客应用程序,其中包含可以通过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

4 回答 4

12

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

于 2012-12-10T08:33:32.227 回答
1

编辑:好吧,我的错,很困惑。你应该调查一下:

在rails中定义锚标签的正确方法是什么?

编辑2:

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

我鼓励你研究这个view_context方法

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

于 2012-12-10T02:59:43.800 回答
0

我最终改用了 Javascript。

post_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>

帖子/投票.js.erb

$('#post_<%= @post.id %>').html('<%= j render @post %>');
于 2012-12-10T19:57:00.593 回答
0

在引擎盖下,当出现问题时,redirect_back(fallback_location: 'some_path')redirects_torequest.referrer并回退到“some_path”。

不幸的是,它没有提供锚点。您可以通过编写一个简单的私有方法来模拟它来解决这个问题。

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

然后,您可以在需要的地方执行此操作。

redirect_to back_with_anchor anchor: @record.id
于 2019-09-10T22:27:54.120 回答