form_for undefined方法`user_path'

时间:2013-02-06 23:13:54

标签: ruby-on-rails ruby-on-rails-3

我收到了一个错误:

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

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

谢谢

在我的StudentsController中:

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

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

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

在routes.rb中:

resources :students

3 个答案:

答案 0 :(得分:91)

您的students_controllerresources :students中的routes.rb行相对应。这会创建使用单词students的路线,例如students_pathnew_student_path。使用form_for(@record)时,URL是根据对象类确定的。在这种情况下,@recordUser,因此当对象是新记录时路径为users_path,而对象保留时为user_path(@record)。由于您没有定义users_controller,因此您需要手动设置form_for的网址以修复此错误

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

现在,如果您正在使用名为_form.html.erb的部分并在新操作和编辑操作上使用此部分,那么您将遇到问题,因为新操作和编辑操作的网址都不同。你必须将你的观点改为这样的

# 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

答案 1 :(得分:0)

我用render中的局部变量修复了它。在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

答案 2 :(得分:0)

如果由于名称空间而在这里(就像10分钟前一样),您将需要此:

  

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

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

来自doc