在UsersController #create中,User.new(params [:user])返回一个空用户(params看起来不错)

时间:2011-11-06 00:21:04

标签: activerecord controller ruby-on-rails-3.1

我是Rails 3.1的新手。我只在我的生产环境中遇到一个问题,我的注册表格(实际上,它更多的是关于控制器)。

以下是用户

中的代码
class UsersController < ApplicationController

[...]

def create
  @user = User.new(params[:user])
  logger.info "value of login in param : #{params[:user][:login]}" #-> log the actual login
  logger.info "value of login : #{@user.login}"                    #-> log empty
  @user.admin = false
  if @user.save
    flash[:notice] = t('flash.notice.user.create.valid')
    redirect_back_or_default root_path
  else
    flash[:notice] = t('flash.notice.user.create.invalid')
    render :action => :new
  end
 end
end

此外,控制器日志显示params散列是好的

Parameters: {"utf8"=>"✓",
  "authenticity_token"=>"QwOqmp0CT/d4mmC1yiLT4uZjP9bNDhbUXHanCQy5ZrA=", 
  "user"=>{"login"=>"myLogin", 
           "email"=>"t.r@gmail.com", 
           "password"=>"[FILTERED]", 
           "password_confirmation"=>"[FILTERED]"}}

我的登录表单按预期工作(已创建的用户可以登录)

同样,这只发生在制作中。

编辑:这是我的用户模型

class User < ActiveRecord::Base
  acts_as_authentic

  #== Callbacks
  before_create :set_defaults

  attr_accessible :avatar     ##### EDIT: TO FIX THE ISSUE, ADD THE OTHER FIELDS AS WELL

  protected

  def set_defaults
    self.total_1 = self.total_2 = self.total_3 = 0
  end
end

1 个答案:

答案 0 :(得分:1)

只是为了纪念上述评论的答案:

通常,您可以使用质量分配来设置模型上的字段,但是当您使用attr_accessible时,则仅限于批量分配这些字段。所以像User.new(params[:user])这样的东西是行不通的;相反,你必须这样做:

@user = User.new
@user.login = params[:user][:login]
# ...etc.
@user.save

简单地将您的字段添加到attr_accessible列表,然后您可以返回批量分配。