43

我收到一个错误:

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

当我尝试编辑学生时。我不太了解“user_path”方法警报,因为我从来没有在视图中写过这个。(学生不是模型)而且我没有使用 rails g scaffold 来生成它。

谢谢

在我的学生控制器中:

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

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

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

在 routes.rb 中:

resources :students
4

3 回答 3

98

你有一个students_controller对应resources :students于你的routes.rb. 这将创建使用单词studentslikestudents_path和的路由new_student_path。使用form_for(@record)时,url 由 objects 类确定。在这种情况下,@record是 aUser所以路径是users_path当对象是新记录并且user_path(@record)对象被持久化时。由于您没有users_controller定义,您需要手动设置的 urlform_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
于 2013-02-07T00:24:51.513 回答
5

如果您因为命名空间而在这里(例如 10 分钟前的我),您将需要这个:

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

<%= form_for([:admin, @post]) do |f| %>
 ...
<% end %>

文档

于 2019-07-21T23:20:40.177 回答
1

我用渲染中的局部变量修复它。在 rails 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
于 2019-02-07T13:03:42.910 回答