2016-03-29 4 views
0

Я хочу использовать одну форму для отправки данных в две таблицы: Вопросы и ответы.Проблемы с маршрутом при использовании nested_attributes в Rails 4

Для этого я использую accepts_nested_attributes_for как outlined here. Вот мой Question.rb модель:

class Question < ActiveRecord::Base 

    has_many :answers 
    belongs_to :category 
    accepts_nested_attributes_for :answers, :allow_destroy => true 
end 

Тогда в моей _form зрения, я использую:

<% form_for(@question, :url => question_path(@question)) do |f| %> 
    <% f.text_field :question_text %> 
<% f.fields_for :answers do |builder| %> 
<%= builder.text_field :answer_text %> 
    <% end %> 
    <% end %> 

Это создает путаницу ошибку: No route matches {:action=>"show", :controller=>"questions", :id=>nil} missing required keys: [:id].

Даже если я вручную добавлю идентификатор к параметрам (например, http://localhost:3000/triviabuilder/new?id=1), я все равно получаю эту ошибку.

Нужно ли мне указывать ID в параметрах, и если да, то это должно быть сделано в контроллере?

EDIT - Добавление routes.rb

Example::Application.routes.draw do 

    resources :games 

    resources :questions 

    resources :answers 

    resources :triviabuilder 

    devise_for :users 

    root "pages#home" 
    get "triviabuilder" => "triviabuilder#index" 
    get "new_triviabuilder" =>"triviabuilder#new" 

EDIT 2 - Добавление TriviaBuilder контроллер пытается вызвать таблицу Вопрос, так как она включает в себя nested_attributes

class TriviabuilderController < ApplicationController 
    def new 
     @question = Question.new 
    end 

    def create 
     @question = question.new(params[:question]) 

     if @question.save 
      redirect_to triviabuilder_path, :notice => "Your post was saved" 
     else 
      render "new" 
     end 
     end 
     end 

Это производит ошибка «show» для No route matches {:action=>"show", :controller=>"triviabuilder"} missing required keys: [:id].

+0

вы упомянули шоу-ACTION после отправки формы ..поэтому он дает вам ошибку –

+0

'<% form_for (@question) do | f | %> 'измените строку, как я упомянул –

+0

Пожалуйста, покажите ** ** route.rb ** – dp7

ответ

0

Удалить следующую строку кода из form_for

:url => question_path(@question) 

Кроме того, вам необходимо добавить к вашему =form_for тега в противном случае он не будет виден, Ваш form_for должен выглядеть следующим образом

<%= form_for @question do |f| %> 

Rails автоматически сопоставляет его с действием update.

Надеюсь, что это поможет!

+0

Дал ему шанс. Когда я делаю это точное обновление, он сталкивается с новой ошибкой: «Первый аргумент в форме не может содержать nil или быть пустым». Мне интересно, если это потому, что у меня нет нового действия в моем контроллере. – darkginger

+0

Пожалуйста, вставьте код своего контроллера – RSB

+0

В приведенной выше ошибке я удалил весь свой код контроллера. Если я создаю «новый» метод, например, с помощью: 'def new @question = Question.new end', он показывает ошибку, почти идентичную исходной проблеме: проблема с действием show. Благодаря! – darkginger

1

изменение Try следующие вещи

routes.rb

resources :triviabuilders 

_form.html.erb

<%= form_for(Question.new , url: triviabuilders_path) do |f| %> 
    <% f.text_field :question_text %> 
    <% f.fields_for :answers do |builder| %> 
    <%= builder.text_field :answer_text %> 
    <% end %> 
<% end %> 

имя контроллера должно быть множественное число, изменение TriviabuildersController от TriviabuilderController.

create действие должно быть следующим: путь

def create 
    @question = Question.new(params[:question]) 
    if @question.save 
     redirect_to triviabuilders_path, :notice => "Your post was saved" 
    else 
     render "new" 
    end 
    end 
+0

Теперь загружается страница, хотя формы ее нет (она отображает текст h2 в представлении, но форма не является рендерингом). Сейчас я отлаживаю, но я дам вам знать, если я это выясню. – darkginger

+0

@darkginger тот простой. Убедитесь, что вы использовали тег <%= %> для своего ** form_for ** вместо <% %>. Проверьте мой answe выше. – dp7

Смежные вопросы