Rails - 渲染:目标锚标记的动作?

gro*_*ark 28 ruby ruby-on-rails

我想像这样使用渲染:

render :action => 'page#form'
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

render :template => 'site/page#form'
Run Code Online (Sandbox Code Playgroud)

那也行不通.此特定页面上的表单位于最底层,如果在提交时出现任何错误,我会讨厌将用户默认为页面顶部.我还需要使用render(而不是重定向),因为我需要保留对象及其错误.

如何渲染以定位特定锚标记?

gro*_*ark 29

相信我找到了解决方案.对于其他任何有此问题的人,请将表单指向:

<%= form_tag '/page#form' do %>
Run Code Online (Sandbox Code Playgroud)

似乎已经解决了这个问题.

  • 请注意,无需向控制器添加任何特殊内容(使用 `render` 时,例如处理表单验证错误时)。使用“/page#my_anchor”作为“action”表单属性的值意味着该表单将被发布到“/page#my_anchor”。并且由于`render` 不会改变响应中的url(就像`redirect` 会做的那样),浏览器将(很自然地)尊重锚点,即向下滚动到锚点(在这种情况下为'my_anchor')。 (2认同)

smu*_*ynn 23

关于bobthabuilda的答案的快速总结,对于像我这样不那么聪明的人,他们最近搜索到了这个问题并且似乎无法获得技巧.

首先,从Rails中抽象出来,每个基本的HTML <form>都有一个选项来向目标页面添加锚点,为此你可以将锚点放在'action'属性中,如下所示:

<form action="/contact#form" method="post">
  ...
</form>
Run Code Online (Sandbox Code Playgroud)

这样,提交后,您的浏览器将使用一个/contact#form请求,这将使您直接进入指定的锚点.

我们现在需要做的就是make rails以正确的方式生成我们的表单标签,如上例所示.这将要求我们以两种可能的方式修改我们的观点.

  1. 如果您form_tag在视图中使用,请按照bobthabuilda建议的方式使用它:

    <%= form_tag '/contact#form' do %>
    
    Run Code Online (Sandbox Code Playgroud)

    就这么简单,你只需告诉rails设置我们表单的动作即可 /contact#form

  2. 如果你使用form_for,有一个:anchor参数,进入指定:url如下:

    <%= form_for @message, 
         :url => contact_path(@message, :anchor => 'form') do |form| %>
    
    Run Code Online (Sandbox Code Playgroud)

    或者像这样(如果你依赖:action):

    <%= form_for(@message, 
         :url => { :action => "create" , :anchor => "form" }) do |form| %>
    
    Run Code Online (Sandbox Code Playgroud)

    这样rails将为HTML表单创建正确的操作,并在之后添加我们的锚点.


Fra*_*eil 6

使用JavaScript将视图移动到正确的位置.除此之外我无法知道.

<script>
  window.location = window.location.href + "#form";
</script>
Run Code Online (Sandbox Code Playgroud)

未经测试,但我认为这应该有效.