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

时间:2010-01-15 01:34:54

标签: ruby-on-rails ruby

我希望像这样使用渲染:

render :action => 'page#form'

我也试过这个:

render :template => 'site/page#form'

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

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

7 个答案:

答案 0 :(得分:29)

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

<%= form_tag '/page#form' do %>

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

答案 1 :(得分:22)

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

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

<form action="/contact#form" method="post">
  ...
</form>

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

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

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

    <%= form_tag '/contact#form' do %>
    

    就这么简单,你只需告诉rails将表单的动作设置为/contact#form

  2. 如果您使用form_for,则会有一个:anchor参数,该参数会像这样进入指定的:url

    <%= form_for @message, 
         :url => contact_path(@message, :anchor => 'form') do |form| %>
    

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

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

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

答案 2 :(得分:6)

使用JavaScript将视图移动到正确的位置。我不知道该怎么做。

<script>
  window.location = window.location.href + "#form";
</script>

未经测试,但我认为这应该有用。

答案 3 :(得分:4)

使用redirect_to以便浏览器进行前瞻以滚动到锚点:

redirect_to:action =&gt; 'page',:anchor =&gt; '形式'

答案 4 :(得分:2)

您可以使用不显眼的jQuery和数据属性。

例如在我的应用程序中,我有一个很大的表单,其中包含一个“地址”字段集,用户应该在其中:

  • 写下他的地址然后
  • 点击“检查”按钮显示一个小谷歌地图,看看他输入的地址是否正确。

在他的“检查”按钮后,我想再次渲染表单,但是使用此地址字段集的ancor,显示地图。

这是我的.erb模板:

<fieldset id="address" data-preview="<%= params[:preview] ? true : false -%>">    
<legend>Write you address here, then check it</legend> 
  <div class="field"> 
    <%= f.text_field :address %>
    <input id="preview-button" type="submit" name="preview" value="check">
  </div>
 </fieldset>

点击检查按钮时,会设置params[:preview]。在我的控制器中,create操作如下所示:

def create   
  @obj = current_user.objs.new(params[:obj]) 
  if params[:preview] 
    # geocoding code, and then:
    render action: "edit" 
  else
    #...
  end
end                           

因此,动作编辑将在params[:preview]仍然定义的情况下呈现,这会将#address fieldset data-preview设置为true。即,将呈现此HTML行:

<fieldset id="address" data-preview="true">

现在我需要做的就是通过javascript获取该信息,如果data-previewtrue,则将窗口位置移动到#address锚点。这是我不引人注意的jQuery代码:

$(function() {
  var preview = $("#address").data('preview');
  if (preview == true){
    window.location = window.location.href + "#address";
  }; 
}); 

就是这样!

答案 5 :(得分:0)

我建议使用jQuerys验证插件。您甚至可以使用jquery validate插件实现自己的表单助手,具体取决于您需要验证的对象属性。

当然这是更多的工作,但我相信它会在未来得到回报。

除此之外 - 在收到回复后使用ajaxified提交并处理错误消息。

答案 6 :(得分:0)

如果您使用JQuery,请尝试创建仅在渲染后才适用的if条件,并执行以下操作:

$('#anchor').get(0).scrollIntoView();