如何将参数保存到form_with方法发送的表中



下面的页面显示了3个问题,我想将用户输入存储到一个名为"user_answers"提交时。

(test_one.html.erb)
<%= form_with(scope: @user_answer, url: answer_one_path, local: true) do |form| %>
<p>1. <%= @questions.all[0].question %></p>
<%= form.text_field :answer1 %> --> #I want this input saved in the table.
<p>2. <%= @questions.all[1].question %></p>
<%= form.text_field :answer2 %> --> #I want this input saved in the table.
<p>3. <%= @questions.all[2].question %></p>
<%= form.text_field :answer3 %> --> #I want this input saved in the table.
<%= form.submit "Submit!" %>
<% end %>

提交后,它将移动到应答页,我希望它将:answer1、:answer2、:ans韦尔3存储到列"中;user_answer"在";user_answers"桌子

(Table "user_answers")
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| session_id  | int(11)      | YES  |     | NULL    |                |
| user_answer | varchar(255) | YES  |     | NULL    |                |
| question_id | int(11)      | YES  |     | NULL    |                |
| created_at  | datetime     | NO   |     | NULL    |                |
| updated_at  | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

这是我的控制器。

(homepage_controller.rb)
def test_one
@questions = QuestionAnswer.where(grade: 1, test_num: 1)
end
def answer_one
end
private
def all_answers
params.permit(:answer1, :answer2, :answer3)
end

这是我的模型。

(user_answer.rb)
class UserAnswer < ApplicationRecord
end
(question_answer.rb)
class QuestionAnswer < ApplicationRecord
end

这是我的路线

Rails.application.routes.draw do
post "/answer_one", to: 'homepage#answer_one'
get "/answer_one", to: 'homepage#answer_one'
get "/test_one", to: 'homepage#test_one'

这是桌子"提问者"。

(question_answers table)
*************************** 1. row ***************************
id: 1
question: Color of apple? <-- question
answer: Red             <-- answer
created_at: 2021-06-11 14:36:50
updated_at: 2021-06-11 14:36:50
grade: 1
test_num: 1
question_id: 1  <-- because it's question number 1
*************************** 2. row ***************************
id: 2
question: Color of banana?  <-- question
answer: Yellow            <-- answer
created_at: 2021-06-11 17:12:53
updated_at: 2021-06-11 17:12:53
grade: 1
test_num: 1
question_id: 2  <-- because it's question number 2
*************************** 3. row ***************************
id: 3
question: Color of Orange?  <-- question
answer: Orange            <-- answer
created_at: 2021-06-15 15:54:18
updated_at: 2021-06-15 15:54:18
grade: 1
test_num: 1
question_id: 3  <-- because it's question number 3

例如,如果用户写";红色";对于:answer1;黄色";对于:answer2;橙色";对于:answer3,我希望这些输入与下面的问题编号一起保存;

(table "user_answers")
*************************** 1. row ***************************
id: 1
session_id: null
user_answer: red <-- # user input
question_id: 1   <-- # since it was question number 1
created_at: 2021-06-11 15:01:32
updated_at: 2021-06-11 15:01:32
*************************** 2. row ***************************
id: 1
session_id: null
user_answer: yellow  <-- # user input
question_id: 2       <-- # since it was question number 2
created_at: 2021-06-11 15:01:32
updated_at: 2021-06-11 15:01:32
*************************** 2. row ***************************
id: 1
session_id: null
user_answer: orange  <-- # user input
question_id: 3       <-- # since it was question number 3
created_at: 2021-06-11 15:01:32
updated_at: 2021-06-11 15:01:32

我试图包括";创建";方法,但数据没有保存在user_answers表中。我做错了什么/我做得不够吗?

def create
@user_answer = UserAnswer.create(user_answer: all_answers, question_id: params[:id])
@user_answer.save
end

感谢您的帮助!!

此答案并非复制粘贴解决方案。这是朝着正确的方向前进的一步,涵盖了一些非常高级的主题。如果你是rails的新手,你可能想把它设置为一次只回答一个问题,然后再循环回来。

Rails处理在单个请求中创建多个资源的方法是使用嵌套属性。首先,你可能想要一些域的真实表,而不是存储一堆非规范化的字符串:

# rails g model test title description:text
class Test < ApplicationRecord
has_many :questions
has_many :user_tests
has_many :user_answers, through: :user_tests
end
# rails g model question text:text
class Question < ApplicationRecord
belongs_to :test
end
# rails g model answer text:text
class Answer < ApplicationRecord
belongs_to :question
end

然后你想要一个类;"包装";所有的UserAnswers都可以作为你在回答测试时填写的实际纸张:

# rails g model user_test user:references test:references
class UserTest < ApplicationRecord
delegate :title, :description to: :test
belongs_to :user
belongs_to :test
has_many :user_answers
has_many :questions, through: :test
accepts_nested_attributes_for :user_answers
# creates a user answer for every question in the tests
def seed!
test.questions.each do |q|
user_answers.new(question: q)
end
end
end
class UserAnswer < ApplicationRecord
delegate :text, to: :question
belongs_to :user_test
belongs_to :question
belongs_to :answer
has_many :potential_answers, though: :question,
source: :answers
end

嵌套属性的工作方式是,当您将哈希数组传递给特殊的*_attributes=setter时,ActiveRecord将同时处理嵌套记录的多个实例的构建:

@user_test = UserTest.new(
test_id: 1,
user_answer_attributes: [
{ question_id: 1, answer_id: 2 },
{ question_id: 2, answer_id: 5 },
{ question_id: 2, answer_id: 5 }
]
)

建立差异测试响应收集模型的RESTful方法是创建嵌套路由:

# routes.rb
resources :tests do
resources :user_tests, only: [:new, :create]
end
class UserTestsController < ApplicationRecord
before_action :set_test
before_action :authenticate_user! # assuming you're using Devise
# GET /tests/:test_id/user_tests/new
def new
@user_test = @test.user_tests.new
@user_test.seed!
end
# POST /tests/:test_id/user_tests
def create
@user_test = @test.user_tests.new(user_test_params) do |ut|
ut.user = current_user
end
if @user_test.save
redirect_to '/somewhere', success: 'Thank you for your answers'
else
render :new
end
end
private
def set_test
@test = Test.find(params[:test_id])
end
def user_test_params
params.require(:user_test)
.permit(
user_answer_attributes: [:question_id, :answer_id]
)
end
end

在表单中,您使用fields_for循环关联并为每个嵌套记录创建输入:

<%= form_with(model: @user_test) do |form| %>
<div class="questions">
<%= form.fields_for(:user_answers) do |user_answer| %>
<div class="question">
<%= user_answer.label :answer_id, user_answer.object.text %>
<%= user_answer.collection_select(
:answer_id, 
user_answer.object.potential_answers,
:id,
:text
) %>
</fieldset>
<% end %>
<% end %>

最新更新