0

我有一个事件模型和事件内部的Q + A模型。Rails深入嵌套资源替代访问参数

我新的轨道所以不知道是否有这样做

眼下,事件show.html.erb,我既有一种形式张贴问题中的另一种方法,而每个问题都会有一个当您创建,它正在通过EventQuestionsController路由我show.html.erb内部的问题,我通过PARAMS访问事项标识的形式张贴解答

的路线,如今

resources :events do 
    resources :event_questions, only: [:create, :destroy] 
    end 

坐这样的权利。我是否必须以同样的方式使用我的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

我张贴的答案可以帮助你,没有看到你的控制器和视图的相关部分,它可以很难协助。然而,你不应该真的需要直接访问id参数,因为你的代码应该能够为你确定它。看到我的答案,以了解我指的是什么。 – kobaltz 2014-11-22 04:47:57

+0

我添加了我的'event_questions_controller',让你知道我之前做了什么。我打算用我的event_answers_controller做类似的事情。我试图围绕我的表单寻找我的event_answers。另外,我将如何访问我的'create'中的变量。我能像你所做的那样做同样的事吗? 你可以忽略奇怪的东西B/C我没有使用这个项目的SQL DB。 – Clam 2014-11-22 05:49:38

回答

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 %> 
1

你不应该需要直接访问参数来创建你的n ested记录。例如,如果你的event#new行动,你可能有类似

@event = Event.new 

3.times do 
    question = @event.questions.build 
    5.times do 
    question.answers.build 
    end 
end 

这将创建一个新的事件,并带你到新的一页。在你的New页面中,你应该有嵌套字段来创建和更新嵌套模型。

在表格中,您可以使用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 %> 

我一般喜欢做嵌套协会时使用的部分,但如果你想保持它所有在一个文件中(见下文),它会看起来是这样的。

<%= 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 

从这里,你有三个实例变量分配,并能够访问相关记录您的事件和问题。

+0

我已经添加了一些表单示例和控制器信息。我不明白的是..如果我的路线没有嵌套,我如何获得事件ID等?当我发布到“创建”行动 – Clam 2014-11-22 06:01:08