6

我是 Rails 的新手,并且已经为这个问题苦苦挣扎了好几个小时 - 非常感谢任何帮助。

我在 Bootstrap 模式中有一个注册表单(使用 Devise 和 simple_form),并希望在提交表单时在同一模式中显示错误通知。目前,当表单提交错误时,页面重定向到 /users 并在那里呈现错误。当表单提交没有错误时,页面会停留在主页上,并根据需要显示“成功”闪烁消息。

我不知道这个问题是否是由控制器/路由问题引起的,我是否需要(先学习)添加 jQuery/Javascript/Ajax 或其他东西。

模态代码(包含在部分中)

<div id="signupModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="signupLabel" aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="signupLabel">Sign up</h3>
  </div>

  <div class="modal-body">

    <%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), html: {class: "form-horizontal"}) do |f| %>

      <%= f.error_notification %>

          <%= f.input :name,
                      placeholder: 'John Smith',
                      input_html: {class: 'span7'} %>
          ...

      <div class="form-actions">
        <%= f.submit "Sign up", class: "btn btn-large btn-success" %>
      </div>

    <% end %>

  </div>
</div>

application_helper.rb - 阅读SO 问题后添加此代码

module ApplicationHelper
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end
4

2 回答 2

11

您应该在表单中添加一个:remote => true,这会导致表单通过 Ajax 提交。然后,您需要将控制器修改为respond_toformat.js。它应该尝试保存记录。如果有错误,它应该回复create.js.erbwhich 有如下内容:

$("#errors_div").html("<%= @resource.errors.full_messages %>")
于 2013-09-07T13:39:45.460 回答
0

如果您查看 simple_form 的底层,您会发现它添加了一些新的 css 'error' 类,并根据评估 @model.errors 数组的结果而跨越其中的错误消息。

我不相信该表单旨在处理通过 ajax 提交时显示的错误消息。我认为你的选择是:

  1. 通过“render_to_string”将生成的表单呈现为服务器端的字符串,然后使用 jQuery 回调处理程序或通过将响应呈现为 js 模板替换页面上的内容。
  2. 以 json 格式返回结果,包括 @model.errors,然后在 javascript 中使用此信息更新带有错误消息的表单。

我将从选项 #1 开始,因为它更简单一些。

于 2013-09-06T22:25:24.423 回答