J'ai une forme que je veux apparaître en haut de chaque page, donc je l'ai inclus dans le fichier /app/views/layouts/aplication.html.erb et je reçois la méthode d'erreur Voici la formulaire Snippet dans application.html.erb p> voici mon /app/controlers/user_controller.rb p> non définie Model_name 'pour Nilclass: classe` lorsque vous essayez de charger la page. <% content_for :add_user do %>
<%= form_for @user do |f| %>
<h3>Add new contact</h3>
First Name<br />
<%= f.text_field :first_name %><br />
Last Name<br />
<%= f.text_field :last_name %><br />
Email<br />
<%= f.text_field :email %>
<hr />
<%= f.submit "Add Contact" %>
<% end %>
<% end %>
5 Réponses :
Si le formulaire est inclus pour plusieurs actions (pages), vous devez définir Une bien meilleure approche (et les rails par défaut) consiste à avoir des vues séparées pour chaque action, mais seulement les éléments requis par cette action, et sont chargés dans votre ou si vous devez le forcer à poster à la Créer Code> Méthode P> @user code> sur quelque chose ou la directive form_for code> échouera (cela n'aura rien à Créez un formulaire pour em>). Application.html.erb Code> Disposition avec code>. Vous auriez donc un app / vues / users / new.html.erb code> qui en a le formulaire. Vous Jamais Strike> très besoin de définir des chemins de charge dans des rails, ils sont tous dérivés du modèle, du contrôleur et des noms d'action - ou de votre routes.rb code>. Ceci est une partie essentielle du Convention sur la configuration em> paradigme qui fonctionne si profondément dans les rails. p> form_for code> de sorte qu'il ne dépend pas d'un objet étant présent: p> form_for(User.new, :url => { :action => "create" })
Donc, mettre le formulaire dans l'application / vues / utilisateurs / new.html.erb obtient la page chargée, mais maintenant le formulaire n'apparaît pas. J'ai mis à jour ma question avec des détails.
Oui, comme je ne sais pas quels sont vos besoins, je viens de supposer que vous avez eu une structure de page CRUD standard - voir mon édition ci-dessus si vous devez en effet avoir le formulaire présent sur des pages en dehors de la portée de l'utilisateur.
Dans ce cas, je mettrais le formulaire dans une vue partielle (dire /app/views/users/_inline_form.hmtl.erb code>) et le charger dans l'application application.html.erb code > Mise en page avec <% = Render: partielle => 'Utilisateurs / inline_form'%> code> (notez l'absence du "_").
Juste l'a fait et maintenant cela me donne à nouveau une erreur de nom indéfinie_model.
Si j'essaie l'inverse de l'autre sens, vous avez suggéré et utilisateur form_for (utilisateur.new) code>, j'obtiens une méthode non définie code> users_path```.
form_for (utilisateur.new ,: url => {: action => "Créer",: contrôleur => "Devise / Inscriptions '}) CODE> Le ticker magique depuis que j'utilise le Devise Gem ( que j'aurais probablement dû mentionner précédemment).
Bingo! Si vous utilisez un congé si vous utilisez cependant, vous pouvez aussi utiliser les itinéraires qu'il crée pour vous - donc juste faire <% = form_tag (user_registration_path) do%> code> Devise définit ces itinéraires pour vous. Vous pouvez vérifier quels itinéraires sont disponibles avec routes Rake code> à une invite de commande. Voir aussi Cette question Stackoverflow .
Votre problème est que vous essayez d'ajouter de formulaire à chaque action de votre page, mais vous n'avez pas initialisé l'utilisateur dans toutes les actions. Essayez d'initialiser l'utilisateur dans toutes les actions:
Cela ne fonctionnera pas bien - puisqu'il a le formulaire dans Application.hmtl.erb Code> Il aurait plutôt besoin de mettre le code dans ApplicationController ou de toute sortie de page La portée USERCONTROLLER donnerait toujours l'erreur. Mais c'est universitaire; Il a obtenu sa structure de vue dans un enchevêtrement et devrait refroidir!
OLA est sur place. Le filtre doit être dans l'applicationController, car il doit être exécuté pour chaque page.
Avez-vous essayé de déboguer en premier? Je demande parce que vous dites que vous êtes nouveau dans les rails. Sinon, voici mon approche. Je tiens à le partager, car je suis surpris combien de personnes ne font pas de déboguer soigneusement.
(J'ai créé une application de test afin que je puisse passer à travers votre problème. Tout d'abord, j'ai visité Tout d'abord, regardez la trace de la pile. P> nométhodeurror dans les utilisateurs # index p>
Afficher /Usersers/David/Dev/TESTApp/app/views/layouts/application.html.erb Où la ligne n ° 11
Élevé: p>
Méthode non définie `Model_name 'pour Nilclass: classe
Source extraite (autour de la ligne n ° 11): p>
blockQuote> Ceci vous indique que la ligne 11 dans votre code est le problème. Penser - que pourrait être le problème? Le routage est peu probable parce que vous rendantez la page. Pas une erreur de syntaxe, cela aurait déclenché une autre erreur. Ok, alors continuez à lire: p> rails.root: / utilisateurs / david / dev / testapp p>
Trace d'application | Trace-cadre | Trace complète p>
blockQuote> Cliquez maintenant sur "Trace-Frameway" et vous verrez: P> Activemodel (3.2.6) lib / actif_model / nommer.rb: 163: Dans Vous ne comprenez peut-être pas tout cela - peu de personnes font - mais vous verrez que l'erreur vient de Je recommande l'utilisation du gem code> Open_gem code> pour faciliter la creuser dans le code source: P> http: // localhost: 3000 / utilisateurs code>.) p>
Model_Name_From_Record_or_class '
ActiveModel (3.2.6) lib / actif_model / nommer.rb: 158: dans code> param_key '
Actionpack (3.2.6) lib / acte_view / aides / form_helper.rb: 369: In `form_for ' p>
blockquote> Model_Name_from_record_or_from_record_or_class code> qui vient de param_key code> qui vient de form_for code>. C'est un gros indice! P> def self.model_name_from_record_or_class(record_or_class)
(record_or_class.is_a?(Class) ? record_or_class : convert_to_model(record_or_class).class).model_name
end
Cette réponse est vraiment juste la réponse de Someth corrigée, mais la solution consiste à définir ou em> en créant un nouveau modèle dans le formulaire_for lui-même ( NOTE: Ceci est laid en termes de séparation des préoccupations, mais cela fonctionne ...) p> @user code> pour chaque action du contrôleur, pas seulement ceux relatifs à un contrôleur spécifique. Ceci peut être fait en utilisant un avant_filter code> dans l'applicationController, c'est-à-dire
dans le USERCONTROLLER:
def index @user = User.new end
Je suppose "en essayant de charger la page" Vous voulez dire
/ utilisateurs code>Désolé, je chargée de cette page
http: // localhost: 3000 / admin / index code>Oui, je pensais que dans l'exemple ci-dessus
/ users / nouvelle code> devrait fonctionner (type de), bien que vous avez la structure de votre vue tout faux - voir ma réponse ci-dessous.J'ai bien peur que vous ayez aussi la directive code> de rendement code> à l'envers - croyez-moi, je sais à quel point tout cela est confondre tout ce genre de choses que vous avez frappé les rails. <% = rendement: quelque chose%> rendra la sortie de l'action actuelle i>, qui varierait en fonction de la page que vous êtes sur. Idéal pour quand vous voulez que chaque contrôleur / action définit le contenu d'un élément de page universel (souvent utilisé pour définir le titre du document), mais vous souhaitez réellement le contraire complet - pour rendre un composant de la même manière sur chaque page. Pour cela, vous devez utiliser
<% = rendu: partielle => "chose / partiel"%> code> dans votre modèle.