使用 Accepts_nested_form_for 创建调查
我一直在使用rails3,并一直在尝试创建一个简单的调查应用程序,但出现了一些问题。我可以很好地提出问题,但在创建人们可以参加的调查时,我遇到了一些问题。其一,答案没有被分配:user_id 或:survey_id。以下是我的控制器、模型和视图的副本。
调查控制器
def take
@survey = Survey.find(params[:id])
@questions = @survey.questions
@answers = @questions.map{|q| q.answers.build}
@answers.each do |a|
a.survey_id = @survey.id
a.user_id = current_user.id
end
respond_to do |format|
format.html #
end
end
def submit
@survey = Survey.find(params[:id])
respond_to do |format|
if @survey.update_attributes(params[:survey])
format.html { redirect_to(@survey, :notice => 'Survey was successfully submitted.')}
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @survey.errors, :status => :unprocessable_entity }
end
end
end
调查模型
class Survey < ActiveRecord::Base
belongs_to :user
has_many :questions, :dependent => :destroy
has_many :answers, :through => :questions, :dependent => :destroy
validates_presence_of :name, :user_id
accepts_nested_attributes_for :questions, :allow_destroy => true
end
问题 模型
class Question < ActiveRecord::Base
belongs_to :survey
has_many :answers
validates_presence_of :question_string, :question_type
accepts_nested_attributes_for :answers, :allow_destroy => true
end
答案 模型
class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :user
belongs_to :survey
end
查看
%h1 Take the survey
- semantic_form_for @survey, :url => { :action => "submit" } do |s|
- if @survey.errors.any?
%p= pluralize(@survey.errors.count, "error") + " prohibited this survey from being saved"
#survey_errors
- @survey.errors.full_messages.each do |err_msg|
%p= err_msg
#survey_details.header
= s.fields_for :questions do |q|
= q.fields_for :answers do |a|
= render 'answer_fields', :s => a
.actions
= s.commit_button
问题 部分
#questions_form.fields
= s.input :question_string, :label => "Question: "
= s.input :question_type, :as => :radio, :collection => [1,2,3,4], :label => "Question Type:"
= s.hidden_field :_destroy
= link_to_function "Remove Question", "remove_fields(this)"
答案 部分
#answers_form.fields
= s.label :answer_string, "Answer"
= s.text_field :answer_string
= s.hidden_field :question_id
Routes.rb
resources :surveys do
get 'take', :on => :member
put 'submit', :on => :member
end
I have been working with rails3 and have been trying to create a simple survey application but some issues have come up. I can create questions just fine but when it comes to creating a survey that people can take I come accross some issues. For one the answers aren't being assigned a :user_id or :survey_id. The following is a copy of my controllers, models and views.
Survey Controller
def take
@survey = Survey.find(params[:id])
@questions = @survey.questions
@answers = @questions.map{|q| q.answers.build}
@answers.each do |a|
a.survey_id = @survey.id
a.user_id = current_user.id
end
respond_to do |format|
format.html #
end
end
def submit
@survey = Survey.find(params[:id])
respond_to do |format|
if @survey.update_attributes(params[:survey])
format.html { redirect_to(@survey, :notice => 'Survey was successfully submitted.')}
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @survey.errors, :status => :unprocessable_entity }
end
end
end
Survey Model
class Survey < ActiveRecord::Base
belongs_to :user
has_many :questions, :dependent => :destroy
has_many :answers, :through => :questions, :dependent => :destroy
validates_presence_of :name, :user_id
accepts_nested_attributes_for :questions, :allow_destroy => true
end
Questions Model
class Question < ActiveRecord::Base
belongs_to :survey
has_many :answers
validates_presence_of :question_string, :question_type
accepts_nested_attributes_for :answers, :allow_destroy => true
end
Answers Model
class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :user
belongs_to :survey
end
Take View
%h1 Take the survey
- semantic_form_for @survey, :url => { :action => "submit" } do |s|
- if @survey.errors.any?
%p= pluralize(@survey.errors.count, "error") + " prohibited this survey from being saved"
#survey_errors
- @survey.errors.full_messages.each do |err_msg|
%p= err_msg
#survey_details.header
= s.fields_for :questions do |q|
= q.fields_for :answers do |a|
= render 'answer_fields', :s => a
.actions
= s.commit_button
Questions Partial
#questions_form.fields
= s.input :question_string, :label => "Question: "
= s.input :question_type, :as => :radio, :collection => [1,2,3,4], :label => "Question Type:"
= s.hidden_field :_destroy
= link_to_function "Remove Question", "remove_fields(this)"
Answers Partial
#answers_form.fields
= s.label :answer_string, "Answer"
= s.text_field :answer_string
= s.hidden_field :question_id
Routes.rb
resources :surveys do
get 'take', :on => :member
put 'submit', :on => :member
end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试在您的答案部分中添加另一个带有用户 ID 的隐藏字段。
这就是我完成隐藏字段的方式,您只需将变量放在那里即可。我遇到了合并问题,因为没有将其作为键值对传递。
你用什么? HAML,我真的不明白这是如何运作的。
这就是一切正常运行所需的全部。
调查模型
控制器不需要额外的代码
视图需要
fields_for
try adding another hidden field with the user id in your answers partial.
That is how I have done hidden fields, you are just putting the variables in there. I have encountered merge problems by not passing it as key value pair.
What are you using? HAML, I don't really understand how that is working.
This is all you need for everything to work.
Survey model
The controller doesn't need additional code
The view needs
fields_for