I'm getting an error :
undefined method `user_path' for #<#<Class:0x007fd1f223ead0>:0x007fd1f2241af0>
when I'm trying to edit a student. I don't really understand the "user_path" method alert since I never write this in the view. (Student is not model) and I didn't use rails g scaffold to generate it.
Thanks
In my StudentsController :
def edit
@student = User.find(params[:id])
end
In the view (edit.html.erb) :
<%= form_for(@student) do |f| %> ...
In routes.rb :
resources :students
you have a students_controller
which corresponds to the resources :students
line in your routes.rb
. This creates routes that uses the word students
like students_path
and new_student_path
. When using form_for(@record)
, the url is determined from the objects class. In this case, @record
is a User
so the path is users_path
when the object is a new record and user_path(@record)
when the object is persisted. since you don't have a users_controller
defined, you need to manually set the url of the form_for
to fix this error
form_for @user, url: student_path(@user), html: { method: :put } do |f|
now, if you're using a partial called _form.html.erb
and uses this on both the new and edit actions, you're going to have a problem since the urls for both new and edit actions are different. you have to change your views to something like this
# 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
If you are here because of the namespace (like me 10 minutes ago) you'll need this:
For namespaced routes, like admin_post_url:
<%= form_for([:admin, @post]) do |f| %> ... <% end %>
from the doc
i fix it with local variables in render . In 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With