我在活动中有一个事件模型和一个Q + A模型。
我是rails的新手,所以不确定是否有其他方法可以执行此操作
现在,在活动show.html.erb
内,我有一个表单可以发布问题,每个问题都有一个表单来发布答案
这些路线现在就像这样
resources :events do
resources :event_questions, only: [:create, :destroy]
end
当您在show.html.erb
中创建问题时,它会通过EventQuestionsController
进行路由,并通过参数访问event_id。我是否必须以event_answer
我的意思是,我必须在event_questions中嵌套event_answers。我需要知道event_id和event_question_id。
如果这是访问参数的唯一方法。它看起来像这样吗?
resources :events do
resources :event_questions, only: [:create, :destroy] do
resources :event_answers, only: [:create, :destroy]
end
end
event_questions_controller.rb
def create
@event_question = EventQuestion.new(event_question_params)
if @event_question.save
event = Event.find(params[:event_id])
@event_question.event = event
redirect_to event
else
redirect_to :back
end
end
show.html.erb
<%= form_for(@event_question, :url => event_event_questions_path(@event)) do |f| %>
# form stuff
<% end %>
我开始将答案表单更改为此
<%= @event.event_questions.each do |q| %>
<%= q.question %>
<%= q.fields_for :answers do |a| %>
<%= a.label :answer %>
<%= a.text_field :answer %>
<%= a.submit "Answer" %>
<% end %>
<% end %>
答案 0 :(得分:1)
您不需要直接访问参数来创建嵌套记录。例如,如果在event#new
操作中,您可能会有类似
@event = Event.new
3.times do
question = @event.questions.build
5.times do
question.answers.build
end
end
这将创建一个新事件并带您进入新页面。在新页面中,您应该有嵌套字段来创建和更新嵌套模型。
在表单中,您可以使用fields_for
访问相关模型的记录到event
条记录。在new
行动案例中,我们正在构建3个问题,每个问题有5个答案。
<%= simple_form_for @event do |f| %>
<%= f.input :attribute1 %>
<%= f.input :attribute2 %>
<%= f.fields_for :questions do |builder| %>
<%= render 'questions', f: builder %>
<% end%>
<% end %>
我通常喜欢在执行嵌套关联时使用partial,但如果你想将它全部保存在一个文件中(见下文),它看起来就像这样。
<%= simple_form_for @event do |f| %>
<%= f.input :attribute1 %>
<%= f.input :attribute2 %>
<%= f.fields_for :questions do |q| %>
<%= q.input :question_text %>
<%= q.fields_for :answers do |a| %>
<%= a.input :answer_text %>
<% end %>
<% end%>
<% end %>
在show
行动中,您可能会遇到类似这样的事情
@event = Event.find(params[:id])
@questions = @event.questions
@answers = @question.answers if @questions
从这里开始,您分配了三个实例变量,并且能够访问与您的事件和问题相关的记录。
答案 1 :(得分:0)
在一些帮助下,我从一些kobaltz答案和其他一些帮助中得出了这个答案。
备用方法是将信息放在隐藏字段中并将其传递给控制器
<%= @event.event_questions.each do |q| %>
<%= q.question %><br>
<% q.event_answers.each do |a| %>
<%= a.answer %>
<% end %>
<%= form_for(EventAnswer.new) do |f| %>
<%= hidden_field_tag :event_question_id, q.id %>
<%= hidden_field_tag :event_id, @event.id %>
<%= f.label :answer %>
<%= f.text_field :answer %>
<%= f.submit "Answer" %>
<% end %>
<% end %>