我被告知在测验完成之前我不应该创建我的测验对象;用户可以进入测验页面,而不是完成它,并且数据库上会有一个“未使用的”测验。我可以看到它的逻辑。
我无法看到我的测验如何在没有传递@quiz对象的情况下工作。这是我的QuizzesController,当需要测验时,它会被路由到'new'动作:
class QuizzesController < ApplicationController
def index
end
def new
@user = current_user
@quiz = Quiz.create(user_id: current_user.id)
end
def create
@results = Quiz.where(user_id: current_user.id).last
redirect_to results_path
end
end
目前,您可以看到我正在尽可能简单地编写动作。稍后,在“新”操作中,我将添加一个测试,以查看current_user是否已完成测验,如果是,则重定向到results_path。
这是我的表单部分,它作为quizzes / new.html.erb的一部分呈现:
<%= form_for(@quiz) do |f| %>
<p>
<%= f.check_box(:answer1) %>
<%= f.check_box(:answer2) %>
<%= f.check_box(:answer3) %>
<%= f.check_box(:answer4) %>
<%= f.check_box(:answer5) %>
<%= f.check_box(:answer6) %>
<%= f.check_box(:answer7) %>
<%= f.check_box(:answer8) %>
</p>
<p>
<%= f.submit("Get my results!") %>
</p>
<% end %>
再次,测验非常简单,同时我弄清楚发生了什么。
但是我想知道,如果@quiz对象没有在'new'动作中创建,我会将{I-}传递给form_for
来构建表单?
答案 0 :(得分:1)
您可以实例化Quiz
对象而不将其保存到数据库:
def new
@user = current_user
@quiz = Quiz.new(user_id: current_user.id)
end
答案 1 :(得分:0)
通常使用的请求/操作序列如下:
new
操作只是使用默认值初始化模型的实例,并使用空字段呈现记录,通常位于edit
视图中。
def new
@quiz = Quiz.new(user_id: current_user.id)
render :edit
end
create
操作创建记录,在create
操作后,您应通过重定向到view
操作来呈现新创建记录的show
如果您要创建模型的相同实例序列,则可以使用相同的视图或重定向到new
操作。
def create
@quiz = Quiz.create(params)
render :show # or redirect_to :new
end
edit
操作是准备编辑字段,是否使用填充字段呈现edit
视图。
def edit
@quiz = Quiz.where(id: params[:id]).first
end
update
操作会使用edit
视图中设置的值更新记录,然后在当前记录上呈现show
视图。
def update
@quiz = Quiz.update(params)
render :show
end
show
操作只显示存储在数据库值中的模型,然后使用填充字段呈现show
视图。
def show
@quiz = Quiz.where(id: params[:id]).first
end
因此,在 show.erb 视图中,您可以呈现新构建的或Quiz
的实例:
<%= form_for @quiz, url: {action: "create"} do |f| %>
<p>
<%= f.check_box(:answer1) %>
<%# ... %>
</p>
<p>
<%= f.submit "Create Quiz" %>
</p>
<% end %>
但我更喜欢simple-form gem:
<%= simple_form_for @quiz do |f| %>
<%= f.input :answer1, as: :boolean, checked_value: true, unchecked_value: false %>
<%= f.button :submit %>
<% end %>