2011-06-18 4 views
7

J'ai parcouru des tonnes de questions sur les ressources imbriquées pour les form_for et je ne peux obtenir aucune des solutions qui me conviennent. J'ai pensé qu'il était temps de poser une question personnalisée.formulaire pour ressource imbriquée

J'ai deux modèles, des emplois et des questions, les emplois ont beaucoup de questions et de questions appartiennent à des emplois.

J'ai utilisé l'échafaudage pour créer les contrôleurs et les modèles puis imbriqué les ressources dans les routes.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 ce moment je suis en train d'accéder '/ emploi/1/questions/nouvelles' et continuer à obtenir le

NoMethodError dans Questions # nouveau

J'ai commencé avec l'erreur Aucun résultat d'itinéraire {: contrôleur => « questions »} lorsque le code a été

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

Je sais que cela est faux, alors j'ai commencé à essayer d'autres combos et aucun d'entre eux travaillé.

J'ai essayé

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

que

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

que

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

Parmi un tas d'autres combinaisons et qui ne fonctionnent pas.

Voici un lien vers mes routes râteau: clone git https://gist.github.com/1032734

Toute aide est appréciée et laissez-moi savoir si vous avez besoin de plus d'informations, merci.

Répondre

12

Je passe juste l'URL comme une option supplémentaire:

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

EDIT:

Grossistes:

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

Le premier option travaillé, merci! - Que fait l'url qui corrige ça? En outre, job_id pour la question n'est pas mise à jour dans la base de données - aucune idée comment résoudre ce problème? FYI: l'édition a retourné cette erreur: Aucune route ne correspond {: controller => "questions"} – Igrabes

+0

Lorsque vous ne passez pas l'option ': url', Rails essaie de se débrouiller tout seul. Il ne sait pas que 'Question' est toujours une sous-ressource de' Job', parce que ce n'est pas toujours le cas. En ce qui concerne le 'job_id' n'est pas mis à jour, si vous utilisez l'attribution de masse, il est probablement en train de l'ignorer. Appelez 'question.job = new_job' séparément. Cependant, je ne peux pas voir votre code. – d11wtq

+0

Hé @ d11wtq, je ne suis pas tout à fait sûr de ce que vous entendez par Appelez question.job = new_job - où cela se passe-t-il? Voici mon repo [lien (https://github.com/igrabes/InterQ), si cela aide. – Igrabes

2

Voilà comment je le mien :) résolu

Dans votre questions/_form.html.erb

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

Pour que cela fonctionne, vous avez besoin de l'ID du travail. Vous passerez comme suit: Dans le questions_controller.rb

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

Construction (.build) est similaire à l'utilisation de nouvelles (.new) dans le code ci-dessus, avec des différences que dans les anciennes versions de rails; rails 2 vers le bas.

Maintenant, pour l'action create (encore questions_controller.rb)

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

Si vous utilisez uniquement ces derniers, le job_id et sur le terrain user_id dans le modèle de question sera vide. Pour ajouter les ids, faites ceci: Dans votre job_id questions_controller.rb d'ajouter à job_params comme ceci:

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

ensuite pour passer l'identifiant de l'utilisateur (si vous utilisez Devise), faites:

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