首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rails5表单:遍历集合以获取问题列表,但更新不同的模型

在Rails5中,可以使用表单来遍历集合以获取问题列表,并且可以更新不同的模型。这在一些需要处理多个相关模型的场景中非常有用。

首先,我们需要定义一个包含问题和答案的模型。假设我们有一个问题模型(Question)和一个答案模型(Answer),它们之间是一对多的关系,一个问题可以有多个答案。

代码语言:txt
复制
# app/models/question.rb
class Question < ApplicationRecord
  has_many :answers, dependent: :destroy
  accepts_nested_attributes_for :answers, reject_if: :all_blank, allow_destroy: true
end

# app/models/answer.rb
class Answer < ApplicationRecord
  belongs_to :question
end

接下来,我们需要在问题控制器中创建一个新的问题实例,并为其关联的答案模型构建表单。

代码语言:txt
复制
# app/controllers/questions_controller.rb
class QuestionsController < ApplicationController
  def new
    @question = Question.new
    3.times { @question.answers.build }
  end

  def create
    @question = Question.new(question_params)
    if @question.save
      redirect_to @question
    else
      render :new
    end
  end

  private

  def question_params
    params.require(:question).permit(:title, answers_attributes: [:id, :content, :_destroy])
  end
end

在上面的代码中,我们使用3.times { @question.answers.build }来创建3个答案表单字段。你可以根据实际需求来调整这个数字。

接下来,我们需要在问题的视图中使用表单帮助器方法来遍历问题和答案集合,并生成相应的表单字段。

代码语言:txt
复制
<!-- app/views/questions/new.html.erb -->
<%= form_with(model: @question, local: true) do |form| %>
  <%= form.label :title %>
  <%= form.text_field :title %>

  <%= form.fields_for :answers do |answer_fields| %>
    <%= answer_fields.label :content %>
    <%= answer_fields.text_field :content %>
    <%= answer_fields.check_box :_destroy %>
    <%= answer_fields.label :_destroy, 'Remove' %>
  <% end %>

  <%= form.submit %>
<% end %>

在上面的代码中,我们使用form.fields_for :answers来遍历答案集合,并生成相应的表单字段。answer_fields代表每个答案对象,你可以在其中使用表单帮助器方法来生成对应的字段。

最后,我们需要在问题控制器中更新问题的操作中允许答案的更新。

代码语言:txt
复制
# app/controllers/questions_controller.rb
class QuestionsController < ApplicationController
  # ...

  def update
    @question = Question.find(params[:id])
    if @question.update(question_params)
      redirect_to @question
    else
      render :edit
    end
  end

  # ...
end

在上面的代码中,我们使用question_params方法来允许答案的更新。

这样,当我们提交表单时,问题和答案的数据将被正确地保存和更新。

这个功能可以在各种场景中使用,例如创建问卷调查、创建带有多个选项的投票等。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,满足不同规模应用的需求。产品介绍链接
  • 云数据库 MySQL 版(CDB):提供高性能、可扩展的 MySQL 数据库服务。产品介绍链接
  • 云原生容器服务(TKE):基于 Kubernetes 的容器管理服务,简化容器化应用的部署和管理。产品介绍链接
  • 云安全中心(SSC):提供全面的云安全解决方案,保护云上资源的安全。产品介绍链接

以上是一个完善且全面的答案,涵盖了Rails5表单遍历集合以获取问题列表并更新不同模型的相关知识和推荐的腾讯云产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 深入浅析带你理解网络爬虫

    网络爬虫是一种自动获取网页内容的程序或技术。它就像一只“小蜘蛛”,在互联网上爬行,抓取各种信息。 想象一下,网络就像一张大网,上面有无数的网页,而爬虫就是在这张网上穿梭的“小虫子”。它可以根据预设的规则和目标,自动访问大量的网页,并提取出有用的数据。 爬虫的工作原理通常是通过发送请求给服务器,获取网页的源代码,然后解析这些源代码,找到需要的信息。这些信息可以是文本、图片、链接、表格等等。爬虫可以将这些信息存储下来,以便后续的分析和处理。 网络爬虫有很多用途。比如,搜索引擎需要使用爬虫来索引网页,以便用户可以搜索到相关的内容。数据分析师可以使用爬虫来收集数据,进行市场研究、竞品分析等

    01

    数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(First)

    网络爬虫 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。 三.爬虫背后的相关技术和原理 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存储,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。

    01

    2022高频前端面试题(附答案)

    约束性组件( controlled component)与非约束性组件( uncontrolled component)有什么区别? 在 React中,组件负责控制和管理自己的状态。 如果将HTML中的表单元素( input、 select、 textarea等)添加到组件中,当用户与表单发生交互时,就涉及表单数据存储问题。根据表单数据的存储位置,将组件分成约東性组件和非约東性组件。 约束性组件( controlled component)就是由 React控制的组件,也就是说,表单元素的数据存储在组件内部的状态中,表单到底呈现什么由组件决定。 如下所示, username没有存储在DOM元素内,而是存储在组件的状态中。每次要更新 username时,就要调用 setState更新状态;每次要获取 username的值,就要获取组件状态值。

    04

    不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD

    问题篇:     昨天在CSDN看到这样一个帖子:“苦逼的三层代码”: 采用传统的三层架构写代码,每个数据表都要定义一个实体对象,编写后台的时候, Web层需要针对页面的用户输入逐个手动编写赋值到实体对象的各个属性,然后DAL层还要用SqlHelper 进行各个存储过程对应参数的实体赋值, 我的天呀,写几个表还好,多个表呢, 写的后台都没力气, 典型的苦逼代码工没营养,各位有啥好的处理方法或开发方式。。     看到跟帖,大部分都说使用ORM解决这个问题,但我觉得ORM还是没有解决贴主的几个问题: 每个

    08
    领券