2011-11-06 58 views
0

我对Rails 3.1有点新。而且我只是在我的制作环境中使用我的注册表单面临问题(实际上,它更多地是关于控制器)。在UsersController#create,User.new(params [:user])返回一个空的用户(params看起来不错)

这里是用户代码

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"=>"[email protected]", 
      "password"=>"[FILTERED]", 
      "password_confirmation"=>"[FILTERED]"}} 

我的登录表单将按预期(已经创建的用户可以登录in)

再一次,这只发生在生产中。

编辑:这是我的用户模型

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

您在'User'模型中使用'attr_accessible'并且不在列表中包含'login'的任何机会?它只是空的“登录”字段,还是所有的字段都是空的?如果你发布你的'用户'模型,它可能会给我们更多的信息 –

+0

我将模型添加到我的问题。我的模型非常简单。唯一值得注意的是Auth_logic。我的所有领域都是空的,不仅仅是登录。这很奇怪,因为它只发生在生产环境中,而不是环境设备上。 – Thomas

+0

你回答了我的问题。我有保存用户头像的回形针,需要attr_accessible。我天真地只将该字段添加到列表中,而不知道它是用于批量分配的白名单。我修好了它。非常感谢你,你保存了我的编码夜会。 – Thomas

回答

1

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

通常情况下,你可以使用质量分配到一个模型设置的字段,但是当你用attr_accessible ,那么你仅限于批量分配这些字段。所以像User.new(params[:user])这样的东西将不起作用;相反,你必须做的:

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

简单的添加字段到attr_accessible列表,你可以回去质量分配。

+0

谢谢。为了避免将所有字段放在attr_accessible列表中,我使用了attr_protected,我知道一个字段(并且应该)不能被批量分配(:admin)。从维护角度来看更容易。 – Thomas