如何通过事务以多模型形式显示错误消息?

2023-12-09

组织和用户这两个模型具有一对多关系。我有一个组合注册表单,其中一个组织加上该组织的用户进行了注册。

我遇到的问题是:当为用户提交无效信息时,它会再次呈现表单,但不会显示用户的错误消息(例如“用户名不能为空”)。当提交有效信息时,该表单确实有效,并且它确实为组织显示错误消息,但不为用户显示错误消息。

我应该如何调整下面的代码以便也显示用户的错误消息?

def new
  @organization = Organization.new
  @user = @organization.users.build
end

def create
  @organization = Organization.new(new_params.except(:users_attributes))    #Validations require the organization to be saved before user, since user requires an organization_id. That's why users_attributs are above excluded and why below it's managed in a transaction that rollbacks if either organization or user is invalid. This works as desired.

  @organization.transaction do
    if @organization.valid?
        @organization.save
        begin
          # I executed next line in debugger (with invalid user info), which correctly responds with: ActiveRecord::RecordInvalid Exception: Validation failed: Email can't be blank, Email is invalid, Username can't be blank, etc.
          @organization.users.create!(users_attributes)
        rescue
          # Should I perhaps add some line here that adds the users errors to the memory?
          raise ActiveRecord::Rollback
        end
     end
  end

  if @organization.persisted?
    flash[:success] = "Yeah!"
    redirect_to root_url
  else
    @user = @organization.users.build(users_attributes)  # Otherwise the filled in information for user is gone (fields for user are then empty)
    render :new
  end

end

表单视图包括:

<%= form_for @organization, url: next_url do |f| %>
    <%= render partial: 'shared/error_messages', locals: { object: f.object, nested_models: f.object.users } %>
    <%= f.text_field :name %>
        # Other fields

    <%= f.fields_for :users do |p| %>
        <%= p.email_field :email %>
            # Other fields
    <% end %>

    <%= f.submit "Submit" %>
<% end %>

部分错误信息如下:

<% object.errors.full_messages.each do |msg| %>
  <li><%= msg.html_safe %></li>
<% end %>

Update:按照罗布的回答的步骤,我得到了下面的部分错误。这仍然不会为用户显示错误消息。由于某种原因,我在下面的代码中添加了调试器响应nested_model.errors.any?返回 false,而控制器内的调试器(见上文)确实为用户返回错误消息。

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(object.errors.count, "error") %>.
    </div>

    <ul>
      <% object.errors.full_messages.each do |msg| %>
        <li><%= msg.html_safe %></li>
      <% end %>
    </ul>

  </div>
<% end %>

<% if defined?(nested_models) && nested_models.any? %>
  # Debugger: responds with "local-variable" for "defined?(nested_models)" and for "nested_models.any?" returns true.
  <div id="error_explanation">
    <ul>
      <% nested_models.each do |nested_model| %>
      # Debugger: "nested_model" has the same values as "nested_models.any?", as you would expect. But for "nested_model.errors.any?" it returns false, which it shouldn't.
        <% if nested_model.errors.any? %>    #Initially had "unless nested_model.valid?" but then errors for User are immediately displayed on loading the form page (new method).
          <ul>
            <% nested_model.errors.full_messages.each do |msg| %>
              <li><%= msg.html_safe %></li>
            <% end %>
          </ul>
        <% end %>
      <% end %>
    </ul>
  </div>
<% end %>

尝试添加validates_associated :users在你的has_many :users组织中的协会。

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_linked

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过事务以多模型形式显示错误消息? 的相关文章

随机推荐

  • 在样式化组件中使用 Ant Design 变量

    我在用蚂蚁设计和这个结合样式组件里面的一个GatsbyJS地点 我希望能够访问 Ant Design 变量 它们是用Less 在样式组件内 像这样的事情 const StyledButton styled Button background
  • 如何在WordPress中创建子主题?

    我正在尝试创建一个子主题 以便我可以自定义父主题 但它不起作用 我做了我能想到的一切 为我的子主题创建了一个文件夹wp content themes 创建了一个style css样式表并将其保存在子主题文件夹中 Theme Name Twe
  • 意外的 Class.getMethod 行为

    不久前我有一个类似的问题当使用 Class getMethod 和自动装箱时 在您自己的查找算法中实现它是有意义的 但真正让我有点困惑的是以下内容也不起作用 public class TestClass public String doSo
  • 仅使用 JavaScript 选择随机 HTML 元素

    我正在尝试从 HTML 代码中选择一个元素 然后在 JavaScript 中使用它 需要突出显示 HTML 由一个包含 36 个 td 的表格组成 到目前为止我的代码 var box function getRandom return Ma
  • android获取嵌套在数组中的json数组

    就像是这个问题 如何保存在变量中 但是用这个 json 代码 restarutant name Hotel Raja photo http i imgur com Mzt4u jpg address 93 2ndc ross GDP etx
  • ASP.NET 2 项目共享相同的文件

    正如标题所说 我有 2 个 Web 项目 它们具有相同的 css 文件 母版页和一些资源文件 我如何共享这些文件 atm 我有 2 份 解决方案1 将它们绑定到单独的程序集中 以便在您的项目中共享 参考 使用 Visual Studio 2
  • Java:如何为 TextField 执行“onclick”?

    我想让我的文本字段在有人单击它时清除文本 我怎样才能做到这一点 on java awt TextField你可以添加一个MouseListener like so TextField field new TextField field ad
  • VB6 的 ORM/MDA/UML 工具

    我知道 Rational Rose 我们有 Rational Rose 6 但我正在寻找一些其他更有用的工具 它们不会抱怨它们不能在 Windows 98 2000 中运行 当在 WinXP 中安装和运行时 并且与 Rational Ros
  • MySQL JOIN 忽略 NULL 值

    我有以下带有 JOIN 的 SQL 如果我运行它 它会忽略 users 表中的 group id 中具有 NULL 值的记录 因此 我得到的结果较少 SELECT u user id u email g group name FROM us
  • 使用 Python 将 CSV 文件上传到 Google Cloud Storage

    我需要使用 Python 自动将本地 csv 文件上传到 Google Cloud 存储桶中 我可以使用哪个 Python 库 任何示例代码将不胜感激 我们可以使用google python客户端api将文件上传到google云存储 首先
  • iPhone 5 中的定位服务进入“非活动”状态

    甚至我的应用程序也在后台注册位置更新 在我的代码中 self locationManager desiredAccuracy kCLLocationAccuracyThreeKilometers self locationManager d
  • C中使用scanf()连续读取两个字符

    我正在尝试输入用户的两个字符t次数 这是我的代码 int main int t scanf d t char a b for i 0 i
  • 通过 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas 失败,并显示“'utf-8'编解码器无法解码字节...在位置...:无效的起始字节”

    我正在尝试使用 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas with sftp open path file filename as fp fp aux pd read csv fp separator 但是当
  • 菜单元素的 ListView 信号和槽

    我正在尝试使用自定义元素实现某种自定义菜单 最终目标是创建某种带有文本和图标的弹出菜单 但在创作过程中我遇到了一些问题 我可以展示两个主要问题 有一个带有标题的奇怪菜单元素Hello world在第一个位置 看起来像是读取应用程序窗口的标题
  • 当我们显式调用 Finalize() 时,对象内存是否被释放? [复制]

    这个问题在这里已经有答案了 据我的理解 finalize 和 GC 是两个不同的方面 GC使用finalize 方法来释放Object内存 我们无法说明 GC 何时发生 即使我们显式调用 System gc 但我们可以在对象上显式调用 Fi
  • 在 PowerShell 中迭代 PSObject 属性

    我有这个PSObject 来自 XML bool IsActive ShowOnB2C ShowOnB2B IsWebNews str id ProductId GroupName Unit int ProductIdNumeric Pri
  • 无对话发送 Facebook 应用请求

    由于可以使用 FB api Id feed 在没有请求对话框的情况下在用户墙上发布内容 是否可以通过 FB api 向用户发送应用请求 而不是 FB ui apprequests 谢谢您的回答 我真的需要帮助 我已经四处寻找了几个星期 您可
  • SVG CSS 悬停样式

    尝试使用 CSS 对该多色 HTML 图像的 SVG 进行样式化 以便 5 的右侧在悬停时为白色 body background color gray svg height 50vh fill white html5 g st2 st0 f
  • 在 OpenLayers (KML) 中刷新/重绘图层网络链接自动刷新

    TLDR我想刷新计时器上的图层 以便它绘制新的 kml 数据 如更新链接 网络链接 到目前为止 我已经尝试过操作功能如下 function RefreshKMLData layer layer loaded false layer setV
  • 如何通过事务以多模型形式显示错误消息?

    组织和用户这两个模型具有一对多关系 我有一个组合注册表单 其中一个组织加上该组织的用户进行了注册 我遇到的问题是 当为用户提交无效信息时 它会再次呈现表单 但不会显示用户的错误消息 例如 用户名不能为空 当提交有效信息时 该表单确实有效 并