【问题标题】:How to add an anchor to redirect_to :back如何将锚点添加到 redirect_to :back
【发布时间】:2012-11-27 10:34:21
【问题描述】:

我有一个博客应用程序,其中包含可以通过帖子控制器中的vote 操作接收投票的帖子。 因为我允许在 index 和 show 视图中投票,所以我在投票后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}"

或者,如果我要为显示和索引视图使用 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

【问题讨论】:

    标签: ruby-on-rails anchor


    【解决方案1】:

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

    【讨论】:

    • 谢谢@Ahmad。我最终使用 javascript 来处理这个问题。但是当我需要它时,一定会记住这一点!
    • 回答了我自己的问题:redirect_to request.referer + '#some-id'
    • olleicua,您在此评论上方立即提到的重定向解决方案就像一个魅力。谢谢!
    【解决方案2】:

    编辑:好吧,我的错,很困惑。你应该看看这个:

    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

    【讨论】:

    • 嗨@Kevin。感谢您的输入。看来我的第一个选项(使用:back)不起作用,因为它不会接受锚点。第二个选项(使用 if 子句)似乎没问题,并且 view_context 方法有效。我会怎么说,“如果您在索引页面上为帖子投票”?使用current_Page?(posts_path) 不起作用,可能是因为它是在不同的操作中调用的(即不是索引操作)。我怎么说,“如果我在索引页面上为帖子投票,则重定向到索引页面上的该帖子,否则重定向到该帖子的显示页面”
    • 我认为您想要做的不是使用重定向用户的操作,而是实际上让用户为帖子投票而不被重定向到任何地方(留在他投票的同一页面上)。所以我的建议是使用一个简单的 ajax 链接:它执行给定的方法而不改变用户的当前视图。编辑:这是您需要的代码&lt;%= link_to_function "Vote up", "$.ajax({type: 'GET', url: '/your_controller/voteup/'})" %&gt;
    • 好点。这或多或少是我所做的。感谢您的意见。
    【解决方案3】:

    我最终改用了 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
    

    posts/_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>
    

    posts/vote.js.erb

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      redirect_to back_with_anchor anchor: @record.id
      

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 2011-08-27
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 2023-04-10
        • 2014-11-14
        • 2021-11-18
        相关资源
        最近更新 更多