Rails 4 form_for error:ActionController的未定义方法`model_name’::参数:Class

我正在尝试创建一个用于创建用户记录的基本表单:

  

在控制器中:

  def create_user @user = params[:user] @user = User.new if !@user end 

这加载正常,没有错误,但是当我提交表单时,我收到以下错误:

 NoMethodError in Admin#create_user Showing /Applications/MAMP/htdocs/clippo2/app/views/admin/create_user.html.erb where line #6 raised: undefined method `model_name' for ActionController::Parameters:Class Extracted source (around line #6):  

这是我的路线:

  get "admin", to: "admin#index" get "admin/edit_user/:id", to: "admin#edit_user" patch "admin/edit_user/:id", to: "admin#edit_user" get "admin/create_user" post "admin/create_user" get "admin/delete_user" get "access/login" get "access/logout" post "access/attempt_login" root :to => 'pages#home' 

 Extracted source (around line #6): <%= form_for @user, url: {action: "create_user"}, html: {class: "user-create-form"} do |f| %> 

form_for接受ActiveRecord类的对象。 但是你在create_user action中的控制器中犯了一个错误。

create_user操作中的@user变量不是active_record的对象,因为您要active_record分配params[:user]哈希。

像这样更改你的代码:

 def create_user @user = User.new end 

create_user需要params[:user']才能运行,因此无需检查params。 一个简单的修改:

 def create_user @user = User.new(params[:user]) end 

如果params不存在,为什么你会传递User.newcreate_user应该是一个仅发布的路由。 您需要User.new(params[:user])因为如果validation失败,您将把该对象传递回包含错误和现有输入的表单。

在这里更改您的路线:

  get "admin/create_user" => get "admin/new_user" 

然后在控制器中为new_user创建一个新方法:

 def new_user @user = User.new end 

你也是以错误的方式建立你的路线。 使用资源:

 namespace :admin do resources :user end 

有关详细信息,请参阅本指南 。