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?
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
.
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.
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>
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.
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;).
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.