Rails应用程序控制器缺少不丢失的参数

时间:2014-02-10 15:16:30

标签: mysql ruby ruby-on-rails-4

我有像this guy

这样的类似问题

我的控制器具有此功能:

    def user_params
       params.require(:login)
       params.require(:password).permit(:first_name, :last_name, :login, :password,:position)
    end

我收到错误

 `param not found: login`

这是发布请求。

 {"utf8"=>"✓",
 "authenticity_token"=>"H+Z0dGaheQPjl3T+0zcGHw3NFYkQ1HLccG1ETcQFbsk=",
 "user"=>{"first_name"=>"Max",
 "last_name"=>"Werner",
 "position"=>"Business Dev Analyst",
 "login"=>"login",
 "password"=>"[FILTERED]"},
 "commit"=>"Create User"}

问题是我的表中有一个名为login的列。我在命令行中通过mysql检查。我手动创建了一个条目,索引函数登录没有问题...相同的哈希:登录

为什么会在这里抛出错误?

1 个答案:

答案 0 :(得分:1)

您要求login的参数位于参数哈希的“顶级”。在您的帖子请求中,loginpassword参数嵌套在user参数中。

我建议做类似的事情:

params.require(:user).permit(:login, :password)

如果您确定要检查以确保包含loginpassword,则可以执行以下操作:

def user_params
  required_params = params.require(:user)

  required_params.require(:login)
  required_params.require(:password)

  required_params.permit(<permitted_params>)
end

可以链接方法调用,但请记住require返回给定键的参数:

1.9.3p484 :001 > params = { :name => { :first => "Chris" } }
 => {:name=>{:first=>"Chris"}} 

1.9.3p484 :002 > ActionController::Parameters.new(params).require(:name).require(:first)
 => "Chris"

所以,如果你想使用链接,你的方法看起来像这样:

def user_params
  params.require(:user)

  params.require(:user).require(:login)
  params.require(:user).require(:password)

  params.require(:user).permit(<permitted_params>)
end

我的意见是前者更清洁,但无论哪种方式都可以获得您想要的结果。

The documentation on parameters实际上非常好,并举了很多例子。我强烈建议您查看它。