Подтвердить что ты не робот

Form_for undefined метод `user_path '

Я получаю сообщение об ошибке:

undefined method `user_path' for #<#<Class:0x007fd1f223ead0>:0x007fd1f2241af0>

когда я пытаюсь редактировать ученика. Я действительно не понимаю оповещение метода "user_path", так как я никогда не пишу этого в представлении. (Студент не является моделью), и я не использовал rails g scaffold для его создания.

Спасибо

В моем AccountController:

def edit
  @student = User.find(params[:id])
end

В представлении (edit.html.erb):

<%= form_for(@student) do |f| %> ...

В routes.rb:

resources :students
4b9b3361

Ответ 1

у вас есть students_controller, который соответствует строке resources :students в вашем routes.rb. Это создает маршруты, в которых используется слово students, например students_path и new_student_path. При использовании form_for(@record), url определяется из класса объектов. В этом случае @record является User, поэтому путь users_path, когда объект является новой записью и user_path(@record), когда объект сохраняется. так как у вас нет users_controller, вам нужно вручную установить URL-адрес form_for, чтобы исправить эту ошибку

form_for @user, url: student_path(@user), html: { method: :put } do |f|

теперь, если вы используете частичный вызов _form.html.erb и используете это как для новых, так и для редактирования действий, у вас возникнет проблема, так как URL-адреса для новых и действий редактирования различны. вы должны изменить свои взгляды на что-то вроде этого

# 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

Ответ 2

я исправляю это с помощью локальных переменных в рендере. В рельсах 5 - тэг form_with:

# 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

Ответ 3

Если вы находитесь здесь из-за пространства имен (как я 10 минут назад), вам понадобится это:

Для маршрутов с пространством имен, например admin_post_url:

<%= form_for([@document, @comment]) do |f| %>
 ...
<% end %>

из документа