2010-09-02 7 views
0

J'ai un formulaire où j'essaye de faire des opérations CRUD très simples sur des rails avec MongoDB.param étant passé comme nil sous forme de Rails

J'ai mon contrôleur

class RecipesController < ApplicationController 
    def new 
    @recipe = Recipe.new 
    end 

    def update 
    end 

    def create 
    recipe = Recipe.create(params[:title]) 
    redirect_to params[:title] 
    @recipes = Recipe.all 
    end 

    def index 
    @recipes = Recipe.all 
    end 
end 

ma forme

<%= form_for Recipe.new do |f| -%> 

<%= f.text_field :title %> 

<%= f.submit "Create Recipe" %> 

<% end %> 

me semble assez basique pour. Cependant, les paramètres ne parviennent pas au contrôleur, il semble.

Je peux voir les params passés par webrick

Started POST "/recipes" for 127.0.0.1 at 2010-09-02 14:15:56 -0800 
    Processing by RecipesController#create as HTML 
    Parameters: {"authenticity_token"=>"8oyq+sQCAEp9Pv864UHDoL3TTU5SdOXQ6hDHU3cIlM 
Y=", "recipe"=>{"title"=>"test"}, "commit"=>"Create Recipe"} 
Rendered recipes/create.html.erb within layouts/application (4.0ms) 
Completed 200 OK in 51ms (Views: 16.0ms) 

mais les params redirect_to [:] titre renvoie une erreur de valeur nulle. J'ai remarqué que 'title' est dans le paramètre 'recipe', et je ne savais pas si cela pouvait faire partie du problème.

Une des nombreuses choses qui me trouble est que je n'ai jamais besoin d'appeler créer? Est-ce correct? J'appelle 'nouveau' sur le formulaire, et pour une raison quelconque, les rails appellent automatiquement 'créer'?

Répondre

1

Essayez de mettre la redirection dans votre contrôleur après @recipes = Recipe.all comme si, et de faire vos variables et variable d'instance:

def create 
    @recipe = Recipe.new(params[:title]) 
    @recipes = Recipe.all 
    respond_to do |format| 
    if @recipe.save 
     format.html redirect_to params[:title] 
    end 
    end 
end 

Votre syntaxe est assez laid. Je suggère d'utiliser les générateurs Rails prêts à l'emploi pour étoffer votre travail et de baser votre projet sur celui-ci jusqu'à ce que vous soyez bon dans ce que vous faites.

Rails 2:

script/generate scaffold Recipe name:string ingredients:text 

Rails 3:

rails g scaffold Recipe name:string ingredients:text 

alors assurez-vous rake db:migrate

+0

Merci voyage, Bien que votre commentaire sur l'utilisation de générateurs jusqu'à ce que je sois bon à l'écriture de rubis est un peu ce que j'essaie d'apprendre, et je ne trouve pas les générateurs d'outils d'apprentissage. J'ai essayé de comprendre la syntaxe, mais je n'ai pas trouvé un bon guide. Aucune suggestion? – pedalpete

+0

Le premier endroit idéal pour commencer est www.tryruby.org. Après cela, je mémoriserais au moins comment les contrôleurs générés automatiquement fonctionnent et baser votre travail de cela comme un début. D'après l'apparence de votre message, il y a encore de bonnes choses que vous pouvez en tirer avant de partir vous-même dans le désert. En outre, Lynda.com, railscasts.com, peepcode.com, et le site officiel de l'API de rails, sont également de bons endroits. Sans parler de stackoverflow. :RÉ – Trip

0

Comme vous le suggérez le paramètre title est dans votre recipe ensemble de paramètres. Donc, pour créer votre recette, vous devez faire:

Recipe.create(params[:recipe]) 

NB. cela retournera faux et ne pas créer une recette si les validations sur la recette échouent - par exemple. si vous avez besoin d'un titre. Vous ne vérifiez pas pour cela et vous pourriez vouloir. Par conséquent, de même, si vous voulez rediriger le titre de la nouvelle recette (je ne sais pas pourquoi vous voudriez, car ce n'est probablement pas un emplacement valide, mais je vais suivre votre exemple), vous devez faire:

redirect_to params[:recipe][:title] 

ou vous pouvez accéder au titre sur la recette nouvellement créée r.title. De plus, si vous redirigez vers une autre action, il n'y a aucun avantage à configurer des variables d'instance (@recipes) car elles seront perdues pendant la redirection.

Questions connexes