我可以将DOM元素传递给rails渲染方法吗?

时间:2012-11-04 21:45:32

标签: ruby-on-rails

我正在建立的博客上有评论表。

博客帖子很长,因此表单位于页面底部的屏幕外

如果评论未通过验证,则会将用户带回页面顶部,但错误消息会在表单的下方显示。

我希望浏览器专注于评论部分,以便用户看到验证错误消息

这是我的comments_controller的创建动作:

def create
  @article = Article.find(params[:article_id])
  @comment = @article.comments.build(params[:comment])
  if @comment.save
    redirect_to article_path(@article), notice: "Thanks for your comment"
  else
    # is there anyway to pass an id (like #comments) to this render call??
    render 'articles/show'
  end
end

如您所见,如果验证失败,我会致电render 'articles/show'。我希望能够做到这样的事情:

render 'articles/show', :anchor => '#comments'

在理想世界中,上面的代码将呈现文章#how,并将视口焦点设置在评论部分。我知道我可以在使用link_to时传递锚点,但是我可以使用render吗?

这样的事情是否可行,或者我需要使用Ajax解决方案吗?

2 个答案:

答案 0 :(得分:1)

我认为render无法完成你想要的工作。因为render将呈现整个页面(包括布局),但不会呈现您想要更改的唯一文本。

我建议你使用jQuery的Ajax,这更加简单明了。

答案 1 :(得分:1)

您不需要Ajax - 简单的jquery应该可以工作。

像这样的东西(用错误类替换'.error-messages'):

$(document).ready(function(){

  if ($(.error-messages).length) {
      $('body').animate({scrollTop:$('.error-messages').offset().top})
  }

})

在页面加载时,如果有任何错误消息,页面将滚动到错误消息。