2010-01-16 4 views
4

Je suis vraiment vraiment coincé et ennuyé avec cela en ce moment.mauvais nombre d'arguments (2 pour 1) - Rails

Je courais Rails 2.3.5

Mon View/pages/customers.html.erb a simplement:

<% form_tag do %> 
    First Name 
     <%= text_field_tag :firstName, params[:firstName] %> 
    Last Name 
     <%= text_field_tag :lastName, params[:lastName] %> 

     <%= submit_tag "Enter" %> 
<%end%> 

Mon Models/customer.rb a simplement:

class Customer < ActiveRecord::Base 
    attr_accessible :firstName, :lastName 
end 

Mon Controller/pages_controller a

class PagesController < ApplicationController 
    def custs 
    @cust = Customer.new(params[:firstName], params[:lastName]) 
    @cust.save 
    end 
end 

de sorte que vous voyez que j'essaie juste d'entrer deux champs de l'extrémité avant et puis les enregistre à la DB. Cependant, chaque fois que je charge ma page, il me donne l'erreur:

wrong number of arguments (2 for 1) pages_controller.rb:3:in new' pages_controller.rb:3:in custs'

chose étrange est que lorsque j'utilise le script bac à sable/console, je suis en mesure d'insérer des données fines.

Que se passe-t-il ici? s'il vous plaît, quelqu'un explique!

Répondre

7

http://apidock.com/rails/ActiveRecord/Base/new/class voici une petite explication de la nouvelle fonction. La partie cruciale - "passer un hachage avec des noms de clé correspondant au nom de la colonne de la table associée". Au lieu de @cust = Customer.new(params[:firstName], params[:lastName]), vous devriez avoir @cust = Customer.new(:firstName => params[:firstName], :lastName => params[:lastName]). Cela devrait faire l'affaire.

+0

+1 Grande réponse + fond –

+1

réponse impressionnante. maintenant je veux que ma dernière heure soit revenue – Omnipresent

1

La solution rapide est de changer de ligne 3 de pages_controller à ceci:

@cust = Customer.new({:firstName => params[:firstName], :lastName => params[:lastName]}) 

Sans propres keys Rails n'a pas idée de ce que les valeurs que vous passez et dans quel ordre.

Le plus gros problème semble être que votre formulaire n'est pas configuré correctement. Vous pourriez avoir une bonne raison pour cela, mais si ce n'est pas le cas, je vous recommande de créer un projet Rails vierge, et d'utiliser generate scaffold pour voir comment un formulaire/contrôleur Rails normal est configuré.

+0

ouais je jouais juste avec. et enlevé quelques trucs du formulaire pour éviter la verbosité. Je n'aime pas les échafaudages. Je ne pouvais pas croire que le livre AWDR utilise l'échafaudage jusqu'au chapitre 6! – Omnipresent

0

Depuis prend un hachage, à partir de laquelle les attributs seront placés où le hachage a les clés correspondantes, Customer.new(params) devrait suffire, ne devrait-il pas? Sauf si params a aussi des clés pour les attributs que vous ne voulez pas être mis dans ce cas, je suppose.

Il est évident que votre exemple de code peut avoir été vers le bas sous la direction de mieux présenter le problème, mais comme le montre, la #new/# save paire peut généralement être condensé jusqu'à Customer#create(params)

Questions connexes