Rails:强制用户在保存父对象之前创建子对象

2024-02-25

我是 Ruby on Rails 的初学者。目前,我遇到以下问题:我有一堂课Game有一系列图片和句子交替出现。我希望创建新的用户Game需要给出一张起始图片或句子。如果他不这样做,我不想将新创建的游戏保存到数据库中。

class Game < ActiveRecord::Base
  has_many :sentences
  has_many :paintings

  validates_inclusion_of :starts_with_sentence, :in => [true, false]

  [...]
end

我的方法是,在 /games/new 上,用户必须首先给出一幅画或一句话,但我不确定如何强制执行这一点,特别是如何在一个对象中创建和保存子对象以及父对象步。


所以你有两个问题。第一个(尽管问题中的第二个)是“如何一步创建和保存子对象以及父对象”。这是一种常见的模式,看起来像这样:

class Game < ActiveRecord::Base
  has_many :sentences
  has_many :paintings

  accepts_nested_attributes_for :sentences, :paintings # <-- the magic
end

然后,说,views/games/new.html.erb你可以有这样的东西:

<%= form_for :game do |f| %>
  <%= label :name, "Name your game!" %>
  <%= text_field :name %>

  <%= fields_for :sentence do |s| %>
    <%= label :text, "Write a sentence!" %>
    <%= text_field :text %>
  <% end %>

  <%= fields_for :painting do |s| %>
    <%= label :title, "Name a painting!" %>
    <%= text_field :title %>
  <% end %>
<% end %>

当提交此表单时,Rails 将解释POST参数,你最终会得到一个params对象看起来像这样:

# params ==
{ :game => {
    :name     => "Hollywood Squares",
    :sentence => {
      :text => "Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo."
    },
    :painting => {
      :title => "Les Demoiselles d'Avignon"
    }
  }
}

最后,在接收这些的控制器中params:

def create
  new_game = Game.create params[:game] # magic! the associated Sentence and/or
end                                    # Painting will be automatically created

这是对您将要做的事情的非常非常高层次的了解。嵌套属性有自己的属性文档中的部分 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html.

您的另一个问题是如何执行这一点。为此,您需要编写一些自定义验证。有两种方法可以做到这一点。最简单的方法是validate, e.g.:

class Game < ActiveRecord::Base
  # ...

  validate :has_sentence_or_painting  # the name of a method we'll define below

  private # <-- not required, but conventional

  def has_sentence_or_painting
    unless self.sentences.exists? || self.paintings.exists?
      # since it's not an error on a single field we add an error to :base
      self.errors.add :base, "Must have a Sentence or Painting!"

      # (of course you could be much more specific in your handling)
    end
  end
end

另一种方法是创建一个位于另一个文件中的自定义验证器类。如果您需要执行大量自定义验证或者想要在多个类上使用相同的自定义验证,这尤其有用。这个,以及单一方法,呃,方法,都包含在验证导轨指南 http://guides.rubyonrails.org/active_record_validations_callbacks.html.

希望这有帮助!

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

Rails:强制用户在保存父对象之前创建子对象 的相关文章

随机推荐

  • 任务并行库 INotifyPropertyChanged 不抛出异常?

    我有一个 wpf 项目 我在绑定到文本框的属性上使用 INotifyPropertyChanged 我正在使用任务 TaskParallelLibrary 在不同的线程上更新此值 它已正确更新并且不会引发异常 我认为它会抛出异常 因为它是在
  • Angular 4 - Http 请求错误:您在需要流的地方提供了“未定义”

    在尝试执行 HTTP Post 请求时 我收到以下错误 auth service ts c694 156 请求新的时出错 密码 错误消息 您在流所在位置提供了 未定义 预期的 您可以提供 Observable Promise Array 或
  • 如何使用uiwebview显示一些网页?

    如何使用 uiwebview 显示某个 url 请求的网页 我不知道该怎么做 谁能告诉我该怎么做 有开源的吗 谢谢 NSString urlAddress http www google com NSURL url NSURL URLWit
  • 如何更加重视机器学习中的某些特征?

    如果使用像 scikit learn 这样的库 如何为 SVM 这样的分类器的输入中的某些特征分配更多权重 这是人们做还是不做的事 首先 你可能不应该这样做 机器学习的整个概念是使用统计分析分配最佳权重 你在这里干扰了整个概念 因此你需要非
  • 将列表传递给 Tcl 过程

    将列表传递给 Tcl 过程的规范方法是什么 如果我能得到它 以便列表自动扩展为可变数量的参数 我真的很喜欢它 所以像这样 set a b c myprocedure option1 option2 a and myprocedure opt
  • 在 IE 和 Chrome 中上传之前预览图像

    我正在尝试设计一个模块 在用户将图像上传到数据库之前 我想在其中向用户显示图像的预览 我找到了一个适用于 Firefox 但不适用于 IE 和 Chrome 的解决方案 有人可以帮助我吗 这是我的代码 function imageURL i
  • 这个空白隐藏在哪里?

    我有一个字符向量 它是一些 PDF 抓取的文件pdftotext 命令行工具 一切都 幸福地 排列得很好 然而 该向量充满了一种空白类型 无法使用正则表达式 gt test 1 Address Clinic Information Stor
  • whereis python 和 python --version 之间的矛盾

    在一个 Python 环境中 我输入whereis python 并得到以下信息 python usr bin python2 6 usr bin python2 6 config usr bin python usr lib python
  • 如何通知用户NPM包版本更新?

    我用 Node JS 编写了一个 CLI 工具并发布到NPM https www npmjs com package rapid react 每次在终端中运行时 我都需要通知用户可用的新版本及其类型 补丁 次要 主要 以便他 她可以相应地更
  • 如何计算时间复杂度为 O(n log n) 的 XOR(二元)卷积

    是按位异或运算 我认为Karatsuba算法可能可以解决该问题 但是当我尝试在Karatsuba算法中使用XOR代替 时 很难得到子问题 The 卷积定理 https en wikipedia org wiki Convolution th
  • 为什么在 Python 中处理已排序数组并不比处理未排序数组快?

    在这篇文章中为什么处理排序数组比处理随机数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an unso
  • flink kafka生产者在检查点恢复时以一次模式发送重复消息

    我正在写一个案例来测试 flink 两步提交 下面是概述 sink kafka曾经是kafka生产者 sink stepmysql接收器是否扩展two step commit sink comparemysql接收器是否扩展two step
  • 如何构建多部分 MIME 请求并使用 AngularJS 的 $http 方法 POST 它?

    如何构建多部分 MIME 请求并使用 AngularJS http 方法将其 POST 到服务器 API 我正在尝试将图像上传到服务器 图片的二进制数据应该是body使用 POST 方法和多部分 MIME 完成请求 其余查询参数可以作为查询
  • 使用简单 Json 库提取 JSON 数组

    我的 JSON 数据如下所示 Users Username Admin1 Password 123 Username Admin2 Password 456 Username Admin3 Password 789 我正在尝试提取所有用户名
  • Java:如何从线程返回中间结果

    使用Java 7我正在尝试构建一个监视数据存储 某些集合类型 的观察程序 然后在某些点从其中返回某些项目 在本例中 它们是时间戳 当时间戳经过当前时间时 我希望将其返回到起始线程 请参阅下面的代码 Override public void
  • 通过 LDAP 连接到 Active Directory

    我想使用 C 连接到我们的本地 Active Directory 我发现了这个很好的文档 http ianatkinson net computing adcsharp htm 但我真的不知道如何通过 LDAP 连接 你们有人能解释一下如何
  • 如何限制角度摘要仅影响/重新渲染一个组件/指令

    我正在开发一个有角度的应用程序 网站 现在才意识到 每当触发模型更改 摘要时 它都会导致整个页面重新渲染 这看起来既浪费又缓慢 有没有办法导致 限制摘要仅影响它所使用的指令 控制器 例如 如果我有一个带有 interval 的 时钟 指令来
  • 重新加载 Web 项目时 Visual Studio 2019 值未落在预期范围内

    我刚刚升级到VS2019 Pro 我正在设置新的溶液过滤器功能允许我仅使用我正在处理的项目的依赖项来部分加载我的解决方案 并在加载 或重新加载 ASP Net MVC Web 项目时遇到问题 看这里 https youtu be u5Yau
  • auth.getAccessTokenAsync 的 Outlook 插件错误代码 13005

    所以我尝试在 Outlook 插件中使用单点登录 我已在以下位置注册了我的应用程序https apps dev microsoft com https apps dev microsoft com 在我的清单中我有
  • Rails:强制用户在保存父对象之前创建子对象

    我是 Ruby on Rails 的初学者 目前 我遇到以下问题 我有一堂课Game有一系列图片和句子交替出现 我希望创建新的用户Game需要给出一张起始图片或句子 如果他不这样做 我不想将新创建的游戏保存到数据库中 class Game