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