【问题标题】:Saving multiple instances of models in a rails form using CRUD使用 CRUD 以轨道形式保存模型的多个实例
【发布时间】:2016-10-12 04:51:32
【问题描述】:

我正在尝试创建一个同时包含不同模型的多个实例的表单。

我有我的主要模型可视化。一个可视化 (:title, :cover_image) has_many Rows。 A Row has_many Panes (:text_field, :image)

基本上,当用户尝试创建可视化时,他们可以很容易地选择封面图片和标题。但是当我进入接下来的两个级别时,我有点困惑。

系统会提示用户在表单中创建一个新行,他们可以选择每行 1、2 或 3 个窗格。每个窗格都可以接收文本和图像,但 Row 本身不一定有任何属性。

如何在此表单中生成具有多个窗格的多个行?最终结果将需要拥有一堆由许多窗格组成的行。我什至可以在 Rails 中执行此操作吗?

感谢您的帮助!

【问题讨论】:

  • 是的,Rails 在这方面做得很好。 accepts_nested_attributes_for 是您需要阅读的内容。
  • 参考 Rails 指南来构建复杂的表单 [guides.rubyonrails.org/…

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

你可以在 Rails 中做任何事情!在我看来,最好的方法是创建所谓的表单模型,因为这个表单会发生很多事情,而且你不想让几个模型陷入验证,比如你的应用程序的一个视图。为此,您基本上将创建一个类,该类将接收所有这些信息,运行您需要的任何验证,然后在您拥有的任何模型中创建您需要的任何记录。为此,让我们在模型文件夹中创建一个名为 so_much.rb 的新文件(您可以创建任何您想要的文件名,只需确保将类命名为与文件相同,以便 Rails 自动找到它!)

然后在你的 so_much.rb 文件中做:

class SoMuch
    include ActiveModel::Model #This gives us rails validations & model helpers
    attr_accessor :visual_title
    attr_accessor :visual_cover #These are virtual attributes so you can make as many as needed to handle all of your form fields.  Obviously these aren't tied to a database table so we'll run our validations and then save them to their proper models as needed below!
    #Add whatever other form fields youll have

    validate :some_validator_i_made

    def initialize(params={})
       self.visual_title = params[:visual_title]
       self.visual_cover = params[:visual_cover]
       #Assign whatever fields you added here
    end

    def some_validator_i_made
        if self.visual_title.blank?
           errors.add(:visual_title, "This can't be blank!")
        end
    end

end

现在您可以进入正在处理此表单的控制器并执行以下操作:

def new
  @so_much = SoMuch.new
end

def create
     user_input = SoMuch.new(form_params)
     if user_input.valid? #This runs our validations before we try to save
        #Save the params to their appropriate models
     else
        @errors = user_input.errors
     end
end

private

def form_params
    params.require(@so_much).permit(all your virtual attributes we just made here)
end

然后在您看来,您可以将 form_for 设置为 @so_much,例如:

 <%= form_for @so_much do %> 
     whatever virtual attributes etc
  <% end %>

表单模型在 Rails 中有点先进,但对于大型应用程序来说,它可以挽救生命,因为一个模型有许多不同类型的表单,而且你不希望所有的混乱。

【讨论】:

  • 哇,谢谢,这太棒了!所以我需要制作一个 SoMuch 控制器,而不是把代码扔到我的 Visualizations 控制器中,对吧?
  • 没问题。不,您想保留处理视图的控制器,您创建的 SoMuch 类只是一个无表模型,您将在代码中对其执行验证。使用您的普通控制器和其中的操作,并从中调用 SoMuch 类,如图所示。
  • 我看到你的新堆栈,所以只是另一个你可能已经知道的提示,所有模型类都可以在你的所有控制器中使用。
  • 糟糕,我还有一个问题。所以在我看来,我可以根据需要列出尽可能多的属性副本?例如。我可以为行放置一个表单 8 次,在这些行中我每次最多可以放置 3 个窗格?
  • 是的,您在视图中列出的任何属性都需要以不同的方式命名它们(例如:pane_1 和 :pane_2),然后在您的 SoMuch 类中为它们创建虚拟属性,如图所示(attr_accessor :pane_1)。如果您愿意,请将答案标记为正确!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多