我有两个控制器: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 %>
但是当发生异常时(例如用户忘记填写字段),我想显示这些异常,而不仅仅是一个警告说'错误'......实际上,我没有找到办法做到这一点
这是我的DashboarController
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
感谢任何帮助:)
答案 0 :(得分:1)
你正确地重定向成功;但是,在失败时,不应该重定向;您需要渲染表单填充的模板。
if @document.save
redirect_to dashboard_path, notice: 'Created!'
else
render 'dashboard/index'
end
您必须确保索引模板所需的任何变量都可以在documents_controller的create动作中使用(您只需渲染索引模板;您不是从仪表板控制器的索引操作中运行代码)。以下是相关Rails指南的摘录,以澄清:
使用render with:action是Rails新手的常见混淆源。指定的操作用于确定要呈现的视图,但Rails不会在控制器中运行该操作的任何代码。在调用render之前,必须在当前操作中设置视图中所需的任何实例变量。
更多http://guides.rubyonrails.org/layouts_and_rendering.html#using-render