форма для вложенного ресурса

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

У меня есть две модели, задания и вопросы, задания имеют_много вопросов и вопросы принадлежат заданиям.

Я использовал скаффолдинг для создания контроллеров и моделей, а затем вложил ресурсы в route.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 в вопросах#новый

Я начал с ошибки Нет совпадений маршрутов {: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

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


person Igrabes    schedule 18.06.2011    source источник


Ответы (2)


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

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

ИЗМЕНИТЬ:

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

form_for([@job, @question])
person d11wtq    schedule 18.06.2011
comment
Первый вариант сработал, спасибо! - что делает передача URL-адреса, что исправляет это? Кроме того, job_id для вопроса не обновляется в БД - есть идеи, как это исправить? К вашему сведению: редактирование вернуло эту ошибку: маршрут не соответствует {:controller=›questions} - person Igrabes; 18.06.2011
comment
Если вы не передаете опцию :url, Rails пытается решить ее самостоятельно. Он не знает, что Question всегда является подресурсом Job, потому что это не всегда должно быть так. Что касается того, что job_id не обновляется, если вы используете массовое назначение, оно, вероятно, игнорирует его. Позвоните question.job = new_job отдельно. Я не вижу вашего кода, хотя. - person d11wtq; 18.06.2011
comment
Привет, @d11wtq, я не совсем понимаю, что ты имеешь в виду под Call question.job = new_job - куда это идет? Вот мой репозиторий [link(github.com/igrabes/InterQ), если это поможет. - person Igrabes; 18.06.2011
comment
Вам придется либо опубликовать новый вопрос с новой проблемой, либо обновить существующий вопрос, так как я не понимаю, в чем проблема. Похоже, вы пытались сделать что-то вроде question.update_attributes({:job_id => 1}), но это не сработало. Но, вероятно, лучше, если вы опишете проблему более подробно. - person d11wtq; 18.06.2011
comment
Только что посмотрел ваш код. Вы никогда не передаете job_id в Question, поэтому он никогда не получит job_id. Попробуйте @job.questions.new(params[:question]). Это должно убедиться, что он имеет правильную ссылку. Вы все равно должны загрузить Job, просто чтобы убедиться, что job_id действительно существует. @job = Job.find(params[:id]), затем @question = @job.questions.new(params[:question]). - person d11wtq; 18.06.2011
comment
Или это build вместо new, простите? :) Забыл, ActiveRecord не использую. Но принцип остается в силе. - person d11wtq; 18.06.2011
comment
@ d11wtq Спасибо, сборка сработала! Я думаю, что я получаю повесить его. - person Igrabes; 21.06.2011

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

В вашем 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(.build) похож на использование new(.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
person Kaka Ruto    schedule 27.02.2017