我有一个工作用户表。 我使用以下方法生成了一个新表:
rails generate model quiz_answers
..并运行rake db:migrate
我的CreateQuizAnswers迁移文件如下所示:
class CreateQuizAnswers < ActiveRecord::Migration
def change
create_table :quiz_answers do |t|
t.references :user, index: true
t.string :answer1
t.string :answer2
t.string :answer3
t.string :answer4
t.string :answer5
t.string :answer6
t.string :answer7
t.string :answer8
t.timestamps
end
end
end
我有一个quiz_answer模型:
class QuizAnswer < ActiveRecord::Base
belongs_to :user
end
和一个QuizAnswersController:
class QuizAnswersController < ApplicationController
def new
@user = current_user
@quiz_answer = current_user.quiz_answer.build
end
private
def post_params
params.require(:quiz_answer).permit(:body, :user_id)
end
end
我添加了:quiz_answers作为routes.rb中的资源
编辑问题:
为什么,当我尝试构建一个表单(使用Devise)时,我会得到错误&#34;未定义的方法`body&#39; for ...(在这里引用QuizAnswer)&#34;?我有另一个模特&#39; Post&#39;这不会产生这个错误,也没有&#39; body&#39;属性。
我尝试构建表单的页面是home / whattypeofleader.html.erb,在routes.rb中我有:
get "whattypeofleader" => "home#whattypeofleader"
在我的HomeController中,我有:
class HomeController < ApplicationController
def index
end
def whattypeofleader
@user = current_user
@quiz_answer = current_user.quiz_answer.build
end
end
我做错了什么?任何帮助都非常感激,谢谢。
哦,如果你需要它,可以在这里找到表格代码,这部分内容可以被呈现出去&#39;在whattypeofleader:
<%= form_for([current_user, @quiz_answer]) do |f| %>
<p>
<%= f.text_area :body, :autofocus => true , :class => "elearning-input"%>
</p>
<p>
<%= f.submit("Save entry") %>
</p>
<% end %>
答案 0 :(得分:0)
<%= form_for([current_user, @quiz_answer]) do |f| %>
#...
<%= f.text_area :body, :autofocus => true , :class => "elearning-input"%>
您正在此处创建text_area,并告诉rails将此文本区域输入与@quiz_answer.body
属性绑定。为什么呢?
form_for
将数组的最后一个元素指定为表单的对象。它生成一个表单构建器对象(f
),它保留对该对象的引用(f.object
)。使用此表单构建器创建的所有字段都会自动填充值f.object.send(:field_name)
(它还会设置字段的名称,因此在发布时可以轻松匹配参数)。这是rails magic使所有表单字段都填充了模型的数据。
由于您的模型没有body
属性(数据库中没有此类列,也没有定义该名称的方法),f.object.send(:body)
会引发method undefined
错误。
关于此问题的修复,您需要决定如何查找此表单。您的模型包含8列answer<i>
(这令人担忧,并建议您可能希望在此处使用关联)。