render :new not going to the right place after a v

2020-07-01 06:12发布

问题:

I have a 'new' form that gets validated in a post model. When the validator kicks in, it renders incorrectly.

The new post page path is at '/posts/new'

On validation, the new post page path is at '/posts' .. I need it to go back to '/posts/new'.

This is my controller:

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

I have a feeling it might have to do with my form. So here is the formtastic first line:

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

回答1:

This is the correct behavior from rails.

In the create action it simply renders the "new" view file. As such the url will be /posts but the view will correctly display the form. There is nothing wrong with this behavior; and in general rails convention is good form. Also the built in rails errors work if you just render new; however if you redirect they won't display.

If you really feel like you want to go back to that url you need to use:

redirect_to 

instead of render.



回答2:

If validation fails, user should see the form with the errors and stay at /posts/new. That's what you want, right?

There's a simple way to achieve this.

Set remote: true on the form to prevent the url from advancing. Handle ajax:success to replace the form on the page with the newly rendered one.

$('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() function is from this question.