web-dev-qa-db-fra.com

Le premier argument dans la forme ne peut contenir ni être vide - Rails 4

Je reçois cette erreur avec mon formulaire de contact dans Rails:

First argument in form cannot contain nil or be empty

Vue:  

     <%= form_for @contact do |f| %>
     and so on.......

Manette

def new
    @contact = Contact.new
end
 and so on....

J'ai trouvé des erreurs connexes, mais aucune des solutions ne semble correspondre à mon problème. Des indices sur ce qui pourrait causer cela?

37
nil

Le message d'erreur vous indique que vous ne pouvez pas avoir les éléments suivants:

<%= form_for nil do |f| %>
<%= form_for [] do |f| %>

Mon hypothèse est que votre @contact est défini sur nil et qu'il ne provient pas de votre action Contact#new.

FYI cela fonctionnerait simplement si vous faites ceci:

<%= form_for Contact.new do |f| %>

Bien que ce soit pas recommandé .

Vous devez vérifier que la vue contenant votre formulaire est bien rendue par l'action new de votre ContactsController.

70

Je sais que cela a une réponse acceptée, mais cela n'a pas résolu le même problème (je ne voulais pas utiliser le nouveau selon moi) et j'ai l'intention de publier ce que j'ai résolu.

Ceci est toujours une faute de frappe, vous pouvez vérifier vos routes avec $rake routes si les routes sont ok, alors c'est un type de type quelque part ailleurs.

Dans mon cas, j'utilisais un éditeur sublime, et j'avais un disque supplémentaire au-dessus du disque neuf dans mon contrôleur, je ne sais pas comment il est arrivé là-bas, mais c'était là ... Le fait de le supprimer a résolu mon problème après environ une demi-heure de clouer des dents ... Il peut y avoir tout type de faute de frappe qui cause ce problème. Cette erreur signifie simplement que la nouvelle méthode n'est pas utilisée. Si elle était utilisée, la variable aurait été initialisée.

Je répète, toujours une faute de frappe quelque part.

J'espère que cela aide quelqu'un.

6

J'ai eu un problème similaire où un formulaire modal apportait des modifications à un modèle différent de celui affiché sur la page d'arrière-plan. Même si j'avais le @contact = Contact.new requis dans mon contrôleur de contact, je devais ajouter ce code dans le contrôleur pour la page d'arrière-plan.

Par exemple, j'ai un modèle de répertoire téléphonique et, dans la vue d'index de ce dernier, j'ai un modal avec un formulaire qui ajoute un contact à mon modèle de contact. J'ai besoin de @contact = Contact.new avec ma méthode d'indexation dans mon contrôleur PhoneBook: 

class PhoneBook < ApplicationController

  def index
    @contact = Contact.new
    ...
  end
end

Et puis le formulaire dans mon modal qui est affiché sur PhoneBook index.html a la même syntaxe que celle écrite par d’autres:

<div id="phoneBook">
  <div id="myModal" class="modal">
    <%= form_for @contact do |f| %>
    ...
  </div>
</div>
5
quicklikerabbit

Si votre variable d'instance est supposée être nil, vous pouvez utiliser :contact au lieu de @contact et fournir un chemin.

Dans votre cas, le code devrait être,

<%= form_for( :contact , :html => {:class => "form-horizontal", :role => "form"}, url: login_path) do |form| %>

Le login_path est juste un exemple et peut être remplacé comme bon vous semble.

1
Kafka

J'ai eu le même problème mais c'était facile à réparer. Dans votre #example posts_controler.rb, ajoutez la même ligne pour rechercher un message comme dans Edit. Dans ma candidature c'est

def edit
    @post = Post.find(params[:id])
end

Cela ne fonctionne pas ici car je l'ai ajouté mais je n'ai pas sauvegardé mes modifications;). 

0
Łukasz Zając

Cela peut dépendre de l'endroit où votre action nouvelle ou créer est définie. J'ai eu le même problème, il s'est avéré que je devais mettre la commande @Object = object.new dans la méthode page.

Par exemple..

class PagesController < ApplicationController

def home
    @applicant = Applicant.new
end

def about
end

def homeowner
end

fin

J'avais auparavant défini une méthode "nouvelle" et "création" et y avais mis l'action, ce qui est habituel et ce que je fais dans d'autres cas. Je ne sais toujours pas pourquoi.

0
DanTheMann