2010-10-21 6 views
0

J'ai un contrôleur qui est:Rails 3 - contrôleur Conditionnel?

def create 
. 
. 
@project = Project.find(params[:project] 

@Log = Logs.create(params[:action]).merge(:project_id => @project.id)) 
... 
end 

La question hereis que, parfois, quand DEF CREATE, je vais avoir un projet et je veux enregistrer cela. D'autres fois je ne vais pas et c'est parfaitement bien, je veux toujours créer le @Log

Quelle est la bonne façon dans Rails de gérer cela. Je tiens à m'assurer que:

  • La première ligne @project ne génère pas d'erreur.
  • De plus, le @log n'incrimine pas mais insère '' ou NIL tout ce qui est standard.

Merci

+0

Pourriez-vous montrer vos relations dans les modèles? – Lichtamberg

Répondre

0

Créer une méthode protégée près du fond de votre commande comme ceci:

protected 

def project_id 
    # return the cached value if we've already figured it out 
    return @project_id if defined?(@project_id) 

    # get the project by id in a failsafe way 
    project = params[:project_id] ? Project.find_by_id(params[:project_id]) : nil 

    # return nil if the project is nil, so we don't try to call "id" on it 
    return @project_id = nil if project.nil? 

    # cache and return the project id 
    @project_id = project.id 
end 

avis j'ai changé le paramètre à :project_id au lieu de simplement project. Cela correspond mieux à la convention des rails. Maintenant, dans votre action create, et toutes les autres actions, vous pouvez appeler en toute sécurité:

@Log = Logs.create(params[:action]).merge(:project_id => project_id)) 

J'espère que cela aide!

+0

très cool. Mais je somethings quelque chose. Juste vérifié mes journaux. J'ai confié que la méthode protégée est appelée. Mais quand il va trouver le projet (find_by_id) il obtient un ID de NULL .... pas sûr si cela compte ou pas, mais comme je reçois cet ID d'un formulaire, je l'ai changé en: params [: msg ] [: project_id] – user479959

+0

Juste confirmé, l'appel protégé ne peut pas obtenir les paramètres [: msg] [: project_id] il est vide – user479959

+0

Ah ok donc c'est encore le problème ... params [: msg] [: project_id] Does not toujours exister. donc c'est pause encore. hmm – user479959

1

Essayez ceci:

def create 

    @project = (project_id = params[:project_id]).blank? ? nil : 
      Project.find(project_id) 

    @Log = Logs.create(params[:action].merge(@project.nil? ? {} : 
      {:project_id => @project.id})) 

end 

Si l'entrée a un project_id, puis au-dessus solution lancera une erreur si un projet avec l'ID donné est introuvable. Si vous ne voulez pas ce comportement, utilisez find_by_id au lieu de find.