Je reçois une erreur:
undefined method `user_path' for #<#<Class:0x007fd1f223ead0>:0x007fd1f2241af0>
quand j'essaie d'éditer un élève. Je ne comprends pas vraiment l'alerte de la méthode "user_path" puisque je ne l'écris jamais dans la vue. (Student n'est pas un modèle) et je n'ai pas utilisé Rails g scaffold pour le générer.
Merci
Dans mon StudentsController:
def edit
@student = User.find(params[:id])
end
Dans la vue (edit.html.erb):
<%= form_for(@student) do |f| %> ...
Dans routes.rb:
resources :students
vous avez un students_controller
qui correspond à la ligne resources :students
dans votre routes.rb
. Cela crée des itinéraires qui utilisent Word students
comme students_path
et new_student_path
. Lors de l'utilisation de form_for(@record)
, l'URL est déterminé à partir de la classe d'objets. Dans ce cas, @record
est une User
et le chemin est donc users_path
lorsque l'objet est un nouvel enregistrement et user_path(@record)
lorsque l'objet est conservé. puisque vous n'avez pas défini de users_controller
, vous devez définir manuellement l'URL du form_for
pour corriger cette erreur
form_for @user, url: student_path(@user), html: { method: :put } do |f|
À présent, si vous utilisez un partiel appelé _form.html.erb
et que vous l'utilisez à la fois pour les actions nouvelles et d'édition, vous allez avoir un problème, car les URL des actions nouvelles et d'édition sont différentes. vous devez changer votre point de vue pour quelque chose comme ça
# new.html.erb
form_for @user, url: students_path, html: { method: :post } do |f|
render 'form', f: f
# edit.html.erb
form_for @user, url: student_path(@user), html: { method: :put } do |f|
render 'form', f: f
# _form.html.erb
f.text_field :name
f.text_field :title
je le répare avec des variables locales dans le rendu. Dans Rails 5 - form_with tag:
# new.html.erb
render partial: 'form', locals: {user: @user, url: students_path}
# edit.html.erb
render partial: 'form', locals: {user: @user, url: student_path(@user)}
# _form.html.erb
form_with model: user, url: url, local: true do |f|
f.text_field :name
f.text_field :title
end