In Rails when a resource create action fails and calls render :new, why must the URL change to the resource's index url?

后端 未结 5 1802
死守一世寂寞
死守一世寂寞 2020-12-07 14:40

I have a resource called Books. It\'s listed as a resource properly in my routes file.

I have a new action, which gives the new view the standard:

@         


        
5条回答
  •  孤街浪徒
    2020-12-07 15:23

    I just started with the Rails-Tutorial and had the same problem. The solution is just simple: If you want the same URL after submitting a form (with errors), just combine the new and create action in one action.

    Here is the part of my code, which makes this possible (hope it helps someone^^)

    routes.rb (Adding the post-route for new-action):

    ...
        resources :books
        post "books/new"
    ...
    

    Controller:

    ...
    def create
        @book = Book.new(book_params)
    
        if @book.save
            # save was successful
            print "Book saved!"
    
            else
            # If we have errors render the form again   
            render 'new'
        end
    end
    
    def new 
        if book_params
            # If data submitted already by the form we call the create method
            create
            return
        end
    
        @book = Book.new
    
        render 'new' # call it explicit
    end
    
    private
    
    def book_params
        if params[:book].nil?  || params[:book].empty?
            return false
        else
            return params.require(:book).permit(:title, :isbn, :price)
        end
    end
    

    new.html.erb:

    <%= form_for @book, :url => {:action => :new} do |f| %>
      <%= f.label :title %>
      <%= f.text_field :title %>
    
      <%= f.label :isbn %>
      <%= f.text_field :isbn %>
    
      <%= f.label :price %>
      <%= f.password_field :price %>
    
      <%= f.submit "Save book" %>
    <% end %>
    

提交回复
热议问题