Rails form_with errors (remote: true)

2.6k Views Asked by At

How can I display errors using Rails form_with (remote form with Ajax) helper?

I have this code:

def create
  @incoming_package = IncomingPackage.new(tracking: params[:tracking])
  if @incoming_package.save
    redirect_to admin_incoming_packages_path, notice: "created"
  else
    flash.now[:danger] = "error" # not displayed
  end
end

Here is my form:

<%= form_with url: admin_incoming_packages_path do |form| %>
  <%= form.text_field :tracking, required: true, autofocus: true, autocomplete: :off %>
  <%= form.submit "Add" %>
<% end %>

If there is no errors rails-ujs + Turbolinks works fine and new package is automatically added on page. How can I display errors (or anything) if a package failed to save?

2

There are 2 best solutions below

1
On

If you want to check any errors ruby give a very easy way to do it

@incoming_packages.errors.full_messages will show all errors related to your model. also you can interact with all these errors

`<%if @incoming_packages.errors.any?%>
  <% @incoming_packages.errors.full_messages.each do |message| %>
    <%= message %>
  <%end%>
<%end%>`
3
On

Here's a simple way to get you started:

On your form's view page:

<% if @incoming_package.errors.any? 
  <ul>
    <% @incoming_package.errors.each do |error| %>
      <li><%=error.full_messages%></li>
    <% end %>
  </ul>
<% end %>

Then on your create action do:

def create
  @incoming_package = IncomingPackage.new(tracking: params[:tracking])
  respond_to do |format|
    if @incoming_package.save
      flash[:success] = "The package was saved."
      format.html { redirect_to admin_incoming_packages_path, notice: "created" }
      format.json { render json: {success: true}
    else
      @errors = @incoming_package.errors.add(:base, "Some custom message here if you like")
      flash.now[:danger] = "error" # not displayed
      format.html { render 'new' }
      format.json { render json: @incoming_package.errors, status: :unprocessable_entity }
    end
  end
end

You must also make sure your new action has:

@incoming_package = IncomingPackage.new