Rails:如果我的测验模型应该在完成测验时创建,那么form_for如何知道要引用的内容?

时间:2014-12-16 10:31:16

标签: ruby-on-rails formbuilder

我被告知在测验完成之前我不应该创建我的测验对象;用户可以进入测验页面,而不是完成它,并且数据库上会有一个“未使用的”测验。我可以看到它的逻辑。

我无法看到我的测验如何在没有传递@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来构建表单?

2 个答案:

答案 0 :(得分:1)

您可以实例化Quiz对象而不将其保存到数据库:

def new
  @user = current_user
  @quiz = Quiz.new(user_id: current_user.id)
end

答案 1 :(得分:0)

通常使用的请求/操作序列如下:

  1. new操作只是使用默认值初始化模型的实例,并使用空字段呈现记录,通常位于edit视图中。

    def new
       @quiz = Quiz.new(user_id: current_user.id)
       render :edit
    end
    
  2. create操作创建记录,在create操作后,您应通过重定向到view操作来呈现新创建记录的show如果您要创建模型的相同实例序列,则可以使用相同的视图或重定向到new操作。

    def create
       @quiz = Quiz.create(params)
       render :show # or redirect_to :new
    end
    
  3. edit操作是准备编辑字段,是否使用填充字段呈现edit视图。

    def edit
       @quiz = Quiz.where(id: params[:id]).first
    end
    
  4. update操作会使用edit视图中设置的值更新记录,然后在当前记录上呈现show视图。

    def update
       @quiz = Quiz.update(params)
       render :show
    end
    
  5. show操作只显示存储在数据库值中的模型,然后使用填充字段呈现show视图。

    def show
       @quiz = Quiz.where(id: params[:id]).first
    end
    
  6. 因此,在 show.erb 视图中,您可以呈现新构建的或Quiz的实例:

    <%= form_for @quiz, url: {action: "create"} do |f| %>
      <p>
        <%= f.check_box(:answer1) %>
        <%# ... %>
      </p>
      <p>
        <%= f.submit "Create Quiz" %>
      </p>
    <% end %>
    

    但我更喜欢 gem:

    <%= simple_form_for @quiz do |f| %>
       <%= f.input :answer1, as: :boolean, checked_value: true, unchecked_value: false %>
       <%= f.button :submit %>
    <% end %>