form_for undefined方法`user_path'

Max*_*Max 36 ruby-on-rails ruby-on-rails-3

我收到一个错误:

undefined method `user_path' for #<#<Class:0x007fd1f223ead0>:0x007fd1f2241af0>
Run Code Online (Sandbox Code Playgroud)

当我正在尝试编辑学生时.我真的不理解"user_path"方法警报,因为我从未在视图中写过这个.(学生不是模特)我没有使用rails g scaffold来生成它.

谢谢

在我的StudentsController中:

def edit
  @student = User.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)

在视图中(edit.html.erb):

<%= form_for(@student) do |f| %> ...
Run Code Online (Sandbox Code Playgroud)

在routes.rb中:

resources :students
Run Code Online (Sandbox Code Playgroud)

jvn*_*ill 92

你有一个students_controller对应resources :students你的线routes.rb.这将创建使用studentslike students_path和word的路由new_student_path.使用时form_for(@record),URL由对象类确定.在这种情况下,@recordUser这样的路径是users_path当对象是一个新的记录,user_path(@record)当对象被持久化.由于您没有users_controller定义,您需要手动设置form_for修复此错误的URL

form_for @user, url: student_path(@user), html: { method: :put } do |f|
Run Code Online (Sandbox Code Playgroud)

现在,如果您正在使用部分调用_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
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你因为命名空间而来到这里(就像 10 分钟前的我一样),你将需要这个:

对于命名空间路由,例如 admin_post_url:

<%= form_for([:admin, @post]) do |f| %>
 ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

来自文档