【问题标题】:Save Rails model from controller params?从控制器参数中保存 Rails 模型?
【发布时间】:2012-12-20 14:42:30
【问题描述】:

我尝试了 User.create(params),但这表明“控制器”和“动作”不能批量分配。我可以排除这些属性,但有没有更简单的方法来编组我需要的属性?

一些示例似乎表明我可以使用 params[:user],但如果我希望帖子只是用户对象,params[:user] 看起来就像是 nil。

所以我用 {username: 'blah', password: 'blah'} 发帖,用户名和密码在参数中,但不是参数[:user]。

class UsersController < ApplicationController
  def create
    user = User.create(params[:user])
    if user.save
      render :json => user, :status => :created
    else
      logger.error user.errors
      render :json => {:status => :error, :errors => user.errors}, :status => :bad_request
    end
  end
end

【问题讨论】:

  • 这根本不是同一个问题。
  • 如果你做一个简单的params 输出,你会看到它有不同的参数,比如controlleractionUser.create(params) 将尝试创建一个用户并为其分配参数属性。由于您的参数具有非属性值(操作、控制器、提交、utf 等),因此它不会工作并引发批量分配错误。

标签: ruby-on-rails ruby activerecord activemodel


【解决方案1】:

Rails 项目中有一个约定,表单元素以某种方式命名(使用表单助手会自动为您执行此操作):

<input type='text' name='user[username]'>
<input type='text' name='user[username]'>

当它们被发布到控制器时,它们被转换为参数哈希:

params = {
  :user => {
    :username => 'whatever',
    :password => 'somepass'
  }
}

由于路由的工作方式,控制器的键值对、操作、id(如果适用)或任何自定义路由部分都将添加到此参数哈希中。

params.merge!({
  :controller => 'users',
  :action     => 'create'
})

如果params[:user] 对您来说为零,您可能需要更改表单以符合约定。

【讨论】:

    【解决方案2】:

    试试User.create(request.request_parameters)User.create(JSON.parse(request.body.read))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多