渲染:验证后新的没有到达正确的位置

时间:2012-01-08 05:26:31

标签: ruby-on-rails ruby-on-rails-3

我有一个'新'表单,可以在帖子模型中验证。当验证器启动时,它会呈现错误。

新的帖子页面路径位于'/ posts / new'

在验证时,新的帖子页面路径位于'/ posts'..我需要它回到'/ posts / new'。

这是我的控制者:

def create
 @post = current_user.posts.build(params[:post])
 if @post.save
   redirect_to public_post_page_path(@post.public_url)
 else 
   render :action => :new
 end
end

我觉得这可能与我的表格有关。所以这是formtastic的第一行:

<%= semantic_form_for [:student, post], :html => {:id => "post_form"} do |form| %>

2 个答案:

答案 0 :(得分:13)

这是rails的正确行为。

在创建操作中,它只是呈现“新”视图文件。因此,url将是/ posts,但视图将正确显示表单。这种行为没有错;一般来说,轨道惯例是很好的形式。如果你只渲染新的内置轨道错误也可以工作;但是如果你重定向,他们将无法显示。

如果你真的想要回到那个网址,你需要使用:

redirect_to 

而不是渲染。

答案 1 :(得分:0)

如果验证失败,用户应该看到包含错误的表单并保持/posts/new。这就是你想要的,对吧?

有一种简单的方法可以实现这一目标。

在表单上设置remote: true以阻止网址前进。处理ajax:success以使用新渲染的表单替换页面上的表单。

$('form[data-remote=true]').on 'ajax:success', (e, data, status, xhr) ->
  if isHTML(data)
    thisForm = "form[id=#{@getAttribute('id')}]"
    $(thisForm).replaceWith $(data).find(thisForm)

isHtml()函数来自this question