以下是我得到的例外情况:
ActiveRecord::RecordInvalid in UsersController#create
Validation failed: Email can't be blank, Password can't be blank
但是,参数似乎得到了正确的选择:
请求
Parameters
{"utf8"=>"✓",
"authenticity_token"=>"l4gsQ/dO9+482Yf1Eq+MBSEVT9zcG4XdN37h1ZhnEIM=",
"user"=>{"email"=>"d@email.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"username"=>"studentd",
"teacher"=>"Example"},
"commit"=>"Sign up",
"format"=>"user"}
这是UsersController中的create
方法。我使用Devise
进行身份验证,但仍然有一个UsersController,主要是因为我更容易理解。
def create
@user = User.create(:email => params[:email], :password => params[:password],
:password_confirmation => params[:password_confirmation], :username => params[:username],
:teacher => params[:teacher], :role => "student")
@user.save!
end
我知道create
应该为你保存,但如果我没有明确地调用它,那么User模型就不会保存到数据库中。
最后,这是我试图从中获取数据的表单。此处的用例是admin
用户将使用此帐户注册students
。
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => user_registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.label :username %><br />
<%= f.text_field :username %></div>
<div><%= f.label :teacher %><br />
<%= f.text_field :teacher %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
答案 0 :(得分:1)
如果您注意到:params
哈希值,您会看到用户表单本身已作为user
密钥下的哈希提交。
所以params[:email]
实际上是空的。你应该做params[:user][:email]
。
此外,您可以使控制器操作变得更简单:
def create
@user = User.create(params[:user])
@user.role = "student"
@user.save!
end