【问题标题】:Ruby on rails, split a big form into separate smaller formsRuby on rails,将大表单拆分为单独的较小表单
【发布时间】:2012-02-14 23:55:58
【问题描述】:

找不到关于如何将rails中的表单拆分为多个较小表单的问题的答案。

假设你有一个很大的表格

  • 名字
  • 姓氏
  • 性别
  • 年龄
  • 电子邮件
  • 国家
  • 城市
  • 状态

所有这些字段我都有一个validate_presence。所以当我创建几个表单时:

= simple_form_for @profile, :wrapper => :inline do |f|

  = f.label "firstname"
  = f.select :firstname

没有顶部列表中的所有值(名字、姓氏等)我收到错误,因为拆分器表单不包含这些值,并且它们首先需要存在才能做到这一点完全可以工作。

拥有多个表单但只有一部分值并更新它们而不遇到上述问题的好方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 forms ruby-on-rails-3.1


    【解决方案1】:

    如果您希望能够更新模型的各个部分,那么您还需要将验证拆分为多个部分。

    一种方法是在模型中设置一个虚拟属性,该属性由每个表单中的隐藏字段设置。例如,您可能有一个表格:

    = simple_form_for @profile, :wrapper => :inline do |f|
      = f.hidden :form, :input_html => {:value => 'names'} 
      = f.label "firstname"
      = f.select :firstname
    

    然后在你的模型中:

    class Profile
      attr_accessor :form
    
      validates :firstname, :presence => true, :if => lambda { |o| o.form == "names" }
    end
    

    仅当从正确的表单提交更改时,验证才会运行。

    查看条件验证指南:http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation 了解更多详情。

    另一种方式是 apneadiving 建议的多步形式:http://railscasts.com/episodes/217-multistep-forms 这使用与第一个示例相同的技术,具有 current_step 属性,但进度是线性的。

    【讨论】:

    • 谢谢,对于 simple_form,我们需要使用 =f.hidden_​​field :title, :value => "basics" 代替。但是,在修改建议的更改后,当值为空时,我似乎没有进行验证,它只是继续更新配置文件。必须进一步研究,但这至少在正确的轨道上,我使用的是 rails 3.1 也许因此我需要其他语法
    • 确保将“form”参数传递给模型进行赋值。
    • 我有 attr_accessor :form 并搜索了关于将参数传递给模型和 attr_accessor 的信息。 “确保将“表单”参数传递给模型进行赋值”到底是什么意思?thx
    • 我的意思是你应该检查模型上的“form”属性是否真的设置了。上面 lambda 中的简单 puts 可以很容易地证明这一点。如果没有设置“form”属性,那么你必须找出原因。这取决于您的控制器的外观以及模型中的其他代码。例如。如果控制器使用质量分配(例如assign_attributes),您的模型中还需要attr_accessible(与attr_accessor 不同)。阅读apidock.com/rails/ActiveModel/MassAssignmentSecurity/…了解详情。
    • 我错过了一个愚蠢的错字我复制了示例 :=f.hidden_​​field :title, :value => "basics" 应该是 :form 当然,你的示例在那之后效果很好
    【解决方案2】:

    我猜你要求的是多步骤表格。

    查看this screencast,您会发现条件验证是继续的方法。

    【讨论】:

    • 已经找到了,这是多步骤需要的操作,没有步骤过程,但谢谢指出
    猜你喜欢
    • 2023-04-02
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多