必须在我的验证/错误消息或按另一个属性排序之间进行选择

Posted

技术标签:

【中文标题】必须在我的验证/错误消息或按另一个属性排序之间进行选择【英文标题】:Having to choose between my validations/error messages or ordering things by another attribute 【发布时间】:2019-02-19 13:22:06 【问题描述】:

我会尽力解释这一点,我花了很多时间来确保这不是重复的,但如果我忽略了某些事情,我深表歉意。我遇到的问题相当简单,它涉及在使用 cocoon 处理嵌套属性时我可以传递的参数数量simple_fields_for。没有手动添加一些代码来创建错误通知,我没有得到任何东西,所以我不得不像这样设置代码:

课程模式

class Course < ApplicationRecord
  has_many :learning_objectives, dependent: :destroy, inverse_of: :course
end

学习目标模型

class LearningObjective < ApplicationRecord
  belongs_to :course, touch: true
  scope :sorted, ->  order(:sort) 
end

使用f.error_notification 的表单

= simple_form_for(@course) do |f|
  = f.error_notification
  .row
    .col-md-12 Learning Objectives
      = f.simple_fields_for :learning_objectives, f.error_notification do |objective|
        = render 'learning_objective_fields', f: objective
      = link_to_add_association 'Add Another Objective', f, :learning_objectives, class: 'btn btn-default btn-sm', data:  association_insertion_node: '.objectives', association_insertion_method: :append 

学习目标部分

.nested-fields
  .table
    .row
      .col-md-8
        = f.input :name, label: false
      .col-md-2
        = f.input :sort
      .col-md-2.spaced-out
        =link_to_remove_association 'Remove Objective', f, class: 'btn btn-danger btn-xs'

这可以很好地在嵌套字段上获得必要的通知。但是,我以前在simple_fields_for 中使用f,就像您在此处看到的那样:

使用f.object.learning_objectives.order(:sort) 的表单

= simple_form_for(@course) do |f|
  = f.error_notification
  .row
    .col-md-12 Learning Objectives
      = f.simple_fields_for :learning_objectives, f.object.learning_objectives.order(:sort) do |objective|
        = render 'learning_objective_fields', f: objective
      = link_to_add_association 'Add Another Objective', f, :learning_objectives, class: 'btn btn-default btn-sm', data:  association_insertion_node: '.objectives', association_insertion_method: :append 

当我删除该排序时,它会恢复到最初的排序方式,这并不理想。所以问题是我一次只能使用一个参数,而且我不确定是否有一种方法可以为嵌套属性的f 对象使用多个参数。

也许有一种方法可以简单地做到这一点,我也会交叉发布到具有相同标题的堆栈溢出,看看他们是否有建议,以防这太具体而无法在这里提出问题。非常感谢您提供的任何建议或指导,并感谢您提供的伟大宝石!

【问题讨论】:

【参考方案1】:

这很奇怪。除非我感到困惑,simple_fields_for 的第二个参数只能是嵌套项的数组,如果没有给出它只会检查关系/关联。所以我不明白传递 f.error_notification (这是错误的视觉表示)是如何工作的,除非 fields_for 只是跳过它,因为它是一个字符串而不是可枚举的。

其次:如果您调用 order,它将尝试使用 sql 进行排序,因此它确实只会显示数据库中存储的项目。如果您只是尝试对数组进行排序,它将按您的预期工作。例如。像

 f.object.learning_objectives.to_a.sort|x,y| x.sort <=> y.sort

【讨论】:

以上是关于必须在我的验证/错误消息或按另一个属性排序之间进行选择的主要内容,如果未能解决你的问题,请参考以下文章

自定义 HTML5 表单验证最初不显示自定义错误

按属性排序列表,然后按另一个

将一个列表按另一个排序

模型验证导致 iOS 应用崩溃

必需的验证错误消息未以 jquery 弹出模式形式显示

在Python中按值对嵌套字典进行排序,并按另一个值对余数进行排序