Ruby on rails 参数空白的Rails字段
我正在尝试为调查构建嵌套表单,但在Ruby on rails 参数空白的Rails字段,ruby-on-rails,ruby-on-rails-4,nested-forms,form-for,Ruby On Rails,Ruby On Rails 4,Nested Forms,Form For,我正在尝试为调查构建嵌套表单,但在块的字段\u中,我的参数散列缺少值时出现问题 我有以下几种型号。应用程序的工作方式是管理员创建一个MiniPost及其MiniPostQuestions。然后,客户端使用一个minipost创建一个新的MiniPostSurvey。然后,客户端通过电子邮件向用户发送SurveyInvites。当用户响应时,将创建一个新的SurveyResponse,并为调查中的每个MiniPostQuestion创建一个新的QuestionResponse class Mini
块的字段\u中,我的参数散列缺少值时出现问题
我有以下几种型号。应用程序的工作方式是管理员创建一个MiniPost
及其MiniPostQuestions
。然后,客户端使用一个minipost
创建一个新的MiniPostSurvey
。然后,客户端通过电子邮件向用户发送SurveyInvites
。当用户响应时,将创建一个新的SurveyResponse
,并为调查中的每个MiniPostQuestion
创建一个新的QuestionResponse
class MiniPost < ActiveRecord::Base
has_many :mini_post_questions
has_many :question_answers, through: :mini_post_questions
has_many :mini_post_surveys
belongs_to :employer
def questions
mini_post_questions
end
def surveys
mini_post_surveys
end
end
class MiniPostQuestion < ActiveRecord::Base
has_many :question_answers
belongs_to :mini_post
belongs_to :employer
def answers
question_answers
end
end
class MiniPostSurvey < ActiveRecord::Base
belongs_to :mini_post
belongs_to :employer
belongs_to :company
has_many :survey_invites
has_many :survey_responses, through: :survey_invites
def questions
mini_post.questions
end
end
class SurveyInvite < ActiveRecord::Base
belongs_to :mini_post_survey
has_many :survey_responses
def responses
survey_responses
end
end
class SurveyResponse < ActiveRecord::Base
belongs_to :survey_invite
has_many :question_answers
has_many :mini_post_questions, through: :question_answers
end
class QuestionAnswer < ActiveRecord::Base
belongs_to :survey_response
belongs_to :mini_post_question
validates :answer, presence: true
end
我希望每个问题都有一个mini\u post\u question
键,但我不确定如何达到这一点。我认为您的思路是正确的,但您需要让模型接受表单中所需对象的嵌套属性
因此,我认为在您的调查响应
模型中,您应该
class SurveyResponse < ActiveRecord::Base
belongs_to :survey_invite
has_many :question_answers
accepts_nested_attributes_for :question_answers
has_many :mini_post_questions, through: :question_answers
end
class SurveyResponse
另外,因为看起来您没有在这里修改迷你问题,我想说的是,您不需要接受问题的嵌套属性,只需要有一个隐藏字段,将迷你问题id分配给问题答案
所以你的表格应该是这样的
<div class="form-box">
<%= form_for @response, url: "/survey?key=#{@invite.key}", method: :post, html: { role: 'form' } do |f| %>
<% @questions.each do |question| %>
<div class="form-group">
<%= f.fields_for :question_answers, @survey.question_answers.build do |q| %>
<%= q.label question.question %>
<%= q.text_area :answer, class: 'form-control' %>
<%= q.hidden_field :mini_post_question_id, value: question.id %>
<% end %>
</div>
<% end %>
<div><%= f.submit "Submit", :class => "btn btn-primary" %></div>
<% end %>
</div>
“btn btn主要”%>
由于表单接受问题答案的嵌套属性,因此不需要提供调查id
这会让你更接近你的状态。太棒了!谢谢事后看来,我真不敢相信我忘记添加接受嵌套的属性了,因为它非常基本,但是表单结构非常复杂。我很高兴这对您有所帮助:)
class SurveyResponse < ActiveRecord::Base
belongs_to :survey_invite
has_many :question_answers
accepts_nested_attributes_for :question_answers
has_many :mini_post_questions, through: :question_answers
end
<div class="form-box">
<%= form_for @response, url: "/survey?key=#{@invite.key}", method: :post, html: { role: 'form' } do |f| %>
<% @questions.each do |question| %>
<div class="form-group">
<%= f.fields_for :question_answers, @survey.question_answers.build do |q| %>
<%= q.label question.question %>
<%= q.text_area :answer, class: 'form-control' %>
<%= q.hidden_field :mini_post_question_id, value: question.id %>
<% end %>
</div>
<% end %>
<div><%= f.submit "Submit", :class => "btn btn-primary" %></div>
<% end %>
</div>