Rails - 检测到用户表单中的字段但验证仍然失败

时间:2013-04-29 00:56:34

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

以下是我得到的例外情况:

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 %>

1 个答案:

答案 0 :(得分:1)

如果您注意到:params哈希值,您会看到用户表单本身已作为user密钥下的哈希提交。

所以params[:email]实际上是空的。你应该做params[:user][:email]

此外,您可以使控制器操作变得更简单:

def create
   @user = User.create(params[:user])
   @user.role = "student"
   @user.save!
end