2011-06-18 26 views
7

He pasado toneladas de form_for preguntas de recursos anidados y no puedo hacer que ninguna de las soluciones funcione para mí. Pensé que era hora de hacer una pregunta personalizada.formulario para el recurso anidado

Tengo dos modelos, trabajos y preguntas, trabajos has_many preguntas y preguntas belong_to jobs.

Utilicé el andamiaje para crear los controladores y los modelos anidados los recursos en las rutas.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 

En este momento estoy intentando tener acceso a '/ trabajos/1/preguntas/nueva' y seguir recibiendo el NoMethodError

en las preguntas # nueva

Empecé con el error No hay coincidencias ruta {: controlador => "preguntas"} cuando el código fue

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

sé que esto está mal, así que empecé a probar otros combos y ninguna de ellas trabajó.

He intentado

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

que

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

que

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

Entre un montón de otras combinaciones y que no están funcionando.

Aquí hay un enlace a mis rutas rastrillo: git clone https://gist.github.com/1032734

Cualquier ayuda es apreciada y quiero saber si necesita más información, gracias.

Respuesta

12

acabo de pasar la URL como una opción adicional:

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

EDIT:

Proveedores:

form_for([@job, @question]) 
+0

El primer opción trabajada, gracias! - ¿Qué significa que la aprobación de la URL solucione esto? Además, el job_id para la pregunta no se está actualizando en el DB, ¿alguna idea de cómo solucionarlo? FYI: la edición devolvió este error: Ninguna ruta coincide con {: controller => "questions"} – Igrabes

+0

Cuando no se pasa la opción ': url', Rails intenta resolverlo por sí mismo. No sabe que 'Question' es siempre un sub-recurso de' Job', porque no siempre tiene que ser así. Con respecto al 'job_id' que no se actualiza, si está utilizando asignación masiva, probablemente lo esté ignorando. Llame 'question.job = new_job' por separado. No obstante, no puedo ver tu código. – d11wtq

+0

Hola @ d11wtq, no estoy del todo seguro de lo que quieres decir con Call question.job = new_job - ¿A dónde va eso? Aquí está mi repo [link (https://github.com/igrabes/InterQ), si eso ayuda. – Igrabes

2

Esto es cómo resolví mía :)

en su questions/_form.html.erb

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

Para que esto funcione, necesita la identificación del trabajo. Usted pasará de la siguiente manera: En el questions_controller.rb

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

Construido (.build) es similar al uso de la nueva (.new) en el código anterior, con diferencias sólo en las versiones anteriores de los rieles; rails 2 abajo.

ya por la acción create (aún en questions_controller.rb)

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

Si sólo utiliza estos, el job_id y el campo user_id en el modelo cuestión estarán vacías. Para agregar los identificadores, hacer esto: En su job_id questions_controller.rb añadir a job_params así:

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

A continuación, para pasar el ID del usuario (si está utilizando Idear), hacer:

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