Rails深度嵌套资源替代访问params

时间:2014-11-22 04:28:20

标签: ruby-on-rails nested-attributes params rails-routing nested-resources

我在活动中有一个事件模型和一个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 %>

2 个答案:

答案 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 %>