1

我有 2 个控制器: 用户登录成功后,他被重定向到DocumentsController,它有一个表单来创建一个像这样的“快速文档”DashboardController
dashboard_path

<%= 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 %>

但是当发生异常时(比如用户忘记填写字段),我想显示这些异常,而不仅仅是一个警告说“错误”......实际上,我没有找到一种方法来做到这一点

这是我的仪表板控制器

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

和我的 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

任何帮助表示赞赏:)

4

1 回答 1

1

您正确地重定向成功;但是,失败时不应重定向;您需要呈现填写表单的模板。

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

您必须确保索引模板所需的任何变量在documents_controller 的创建操作中可用(您只是呈现索引模板;您没有从仪表板控制器的索引操作运行代码)。以下是相关 Rails 指南的摘录,以澄清:

将 render 与 :action 一起使用是 Rails 新手经常感到困惑的原因。指定的操作用于确定要呈现哪个视图,但 Rails 不会在控制器中运行该操作的任何代码。您在视图中需要的任何实例变量都必须在调用渲染之前在当前操作中设置。

更多信息请访问http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

于 2012-08-04T02:32:51.450 回答