2013-08-28 51 views
1

我试图做一个基本形式创建用户记录:轨道4的form_for错误:未定义的方法`MODEL_NAME”为的ActionController ::参数:

<%= debug(@user) %> 
<%= form_for @user, url: {action: "create_user"}, html: {class: "user-create-form"} do |f| %> 
    <div class="form-group"><%= f.text_field :first_name, class:'form-control' %></div> 
    <div class="form-group"><%= f.text_field :last_name, class:'form-control' %></div> 
    <div class="form-group"><%= f.text_field :email, class:'form-control' %></div> 
    <div class="form-group"><%= f.text_field :password, class:'form-control' %></div> 
    <%= f.submit "Update" %> 
<% end %> 

在控制器:

def create_user 
    @user = params[:user] 
    @user = User.new if [email protected] 
    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): 
    <%= form_for @user, url: {action: "create_user"}, html: {class: "user-create-form"} do |f| %> 

这里是我的[R欧特斯:

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' 
+0

你可以粘贴你的路线代码。 –

+0

只是将它们添加到问题 – emersonthis

+1

尝试在您的视图中更改'@ user'到':user'(即'form_for:user(...)' – zrl3dx

回答

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

form_for接受ActiveRecord类的对象。但是您在create_user操作中在控制器中犯了错误。

@user变量create_user由于您正在为其分配params[:user]散列,因此动作不是active_record的对象。

更改您这样的代码:

def create_user 
    @user = User.new 
end 
+0

工作正常!但是我不得不在user.new(params [:user])'中对用户强壮的参数进行一次修改而不是params [:user]'。是否我的错误是针对Rails 4?2的。是否有必要检查params && params [:user]?后者是否需要前者? – emersonthis

+0

1. Rails 4具体只是强大的参数,而不是代码。2.您可以避免第一个,我将编辑答案但为什么你需要检查params [:user],你是否也通过其他的形式向这个动作发送请求(任何检查参数的特殊原因)? –

+0

@AmanGarg看到我的答案,他错误地将'create_user'设置为'get'和'post',当他应该使用'get new_use r','post create_user'。 –

0

create_user要求params[:user']才能运作,因此没有必要检查PARAMS。一个简单的修改:

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

为什么你会通过User.new如果参数不存在? create_user应该是邮政唯一路线。您需要User.new(params[:user]),因为如果验证失败,您会将该对象传递回带有错误和现有输入的表单。

这里更改路线:

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

然后创建在您的控制器的新方法new_user

def new_user 
    @user = User.new 
end 

你也建立在错误的道路的路线。使用资源:

namespace :admin do 
    resources :user 
end 

请参阅this guide了解更多信息。

相关问题