Luiz E.
Luiz E.

Reputation: 7239

how to catch mongoid validation erros from another controller?

I have 2 controllers: DocumentsController and DashboardController
After the user login successful, he is redirected to dashboard_path, which has a form to create a 'fast document' like this

<%= form_for @document, :html => {:class => 'well'} do |f| %>
      <% if @document.errors.any? %>
        <div id="alert alert-block">
          <div class="alert alert-error">
          <h2>Couldn't create your doc. :(</h2>

          <ul>
          <% @document.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
          <% end %>
          </ul>
          </div>
        </div>
      <% end %>
      <label>A lot of fields</label>
      <%= f.text_field :fields %>

      <div class="form-actions">
        <%= f.submit 'Create document', :class => 'btn btn-large' %>
      </div>
    <% end %>

but when an exception happen (like the user forgot to fill a field), I would like to show these exceptions, not just an alert saying 'Error'...actually, I didn't found a way to do this

here's my DashboarController

class DashboardController < ApplicationController
  before_filter :authenticate
  def index
    @document = Document.new
  end
end

and my DocumentsController

class DocumentsController < ApplicationController
  respond_to :json, :html
  def show

  end

  def create
    @document = Document.new(params[:document])
    @document.user = current_user

    if @document.save
      redirect_to dashboard_path, notice: 'Created!'
    else
      flash[:error] = 'Error!'
      redirect_to dashboard_path
    end
  end

end

any help is appreciated :)

Upvotes: 1

Views: 348

Answers (1)

Shailen Tuli
Shailen Tuli

Reputation: 14171

You are correctly redirecting on success; on failure, though, should not redirect; you need to render the template where the form was filled.

if @document.save
  redirect_to dashboard_path, notice: 'Created!'
else
  render 'dashboard/index'
end

You'll have to make sure that any variables needed by the index template are available in the create action of the documents_controller (you're just rendering the index template; you're not running the code from the dashboard controller's index action). Here's a excerpt from the relevant Rails Guide to clarify:

Using render with :action is a frequent source of confusion for Rails newcomers. The specified action is used to determine which view to render, but Rails does not run any of the code for that action in the controller. Any instance variables that you require in the view must be set up in the current action before calling render.

More at http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

Upvotes: 1

Related Questions