форма для вложенного ресурса - PullRequest
7 голосов
/ 18 июня 2011

Я прошел через тонны вопросов о вложенных ресурсах form_for и не могу заставить ни одно из решений работать на меня.Я решил, что пришло время задать персональный вопрос.

У меня есть две модели, задания и вопросы, задания has_many, вопросы и вопросы относятся к заданиям.

Я использовал леса для создания контроллеров и моделей, а затем вложил ресурсы в маршруты. Rb.

root :to => "pages#home"

resources :jobs do
   resources :questions
end

get "pages/home"
get "pages/about"
get "pages/contact"


class Job < ActiveRecord::Base
   has_many :questions
end

class Question < ActiveRecord::Base
   belongs_to :job
end

Сейчас я пытаюсь получить доступ к '/ jobs / 1 / questions / new' и продолжаю получать

NoMethodError in Questions # new

Я начал с ошибки Маршрут не соответствует {: controller => "questions"} , когда код был

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

Я знаю, что это неправильно, поэтому я начал пробовать другие комбинации, но ни одна из них не сработала.

Я пробовал

 <%= form_for([@job.questions.build ]) do |f| %>

, что

 <%= form_for([@job, @job.questions.build ]) do |f| %>

, что

<%= form_for(@job, @question) do |f| %>

Среди множества других комбинаций, которые не работают,

Вот ссылка на мои маршруты рейка: git clone https://gist.github.com/1032734

Любая помощь приветствуется, и дайте мне знать, если вам нужна дополнительная информация, спасибо.

Ответы [ 2 ]

12 голосов
/ 18 июня 2011

Я просто передаю URL в качестве дополнительной опции:

<%= form_for(@question, :url => job_questions_path(@job)) do %>

РЕДАКТИРОВАТЬ:

Также попробуйте:

form_for([@job, @question])
2 голосов
/ 27 февраля 2017

Вот как я решил свою:)

В вашем questions/_form.html.erb

<%= form_for [@job, @question] do %>

Чтобы это работало, вам нужен идентификатор задания.Вы передадите его следующим образом: В questions_controller.rb

def new
  @job = Job.find(params[job_id])
  @question = @job.questions.build
end

сборка (.build) аналогична использованию новой (.new) в приведенном выше коде, с отличиями только в более старых версияхрельсы;рельсы 2 вниз.

Теперь для действия создания (все еще в questions_controller.rb)

def create
  @job = Job.find(params[:job_id])
  @question = @job.questions.build(question_params)
end

Если вы используете только их, поля job_id и user_id в модели вопроса будут пустыми.Чтобы добавить идентификаторы, сделайте следующее: В вашем questions_controller.rb добавьте job_id к job_params, например, так:

def question_params
  params.require(:question).permit(:ahaa, :ohoo, :job_id)
end

Затем, чтобы передать идентификатор пользователя (если вы используете Devise), выполните:

def create
  @job = Job.find(params[:job_id])
  @question = @job.questions.build(question_params)
  @question.user_id = current_user.id
end
...