【问题标题】:Sinatra: wrong number of arguments (4 for 0..2)Sinatra:参数数量错误(4 代表 0..2)
【发布时间】:2015-08-01 08:11:08
【问题描述】:

我目前正在使用 SinatraActiveRecordMySQL 开发应用程序。我正在处理注册表单,如下所示:

app.rb

post '/signup' do
password_salt = BCrypt::Engine.generate_salt
password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)

@usuarios = User.new(params[:nombre], params[:cedula], password_hash, "admin")
if @usuarios.save
    redirect './signup', :notice => "Usuario creado exitosamente."
else
    redirect './signup', :error => "Ha ocurrido un error, intente nuevamente."
end
end

视图看起来像这样,signup.erb

    <form id="registro" action="/signup" method="POST">
    <fieldset>
        <legend>Ingrese sus datos</legend>
        <label>Nombre
            <input type="text" name="nombre">
        </label>
        <label>Cédula
            <input type="text" maxlength="10" name="cedula">
        </label>
        <label>Contraseña
            <input type="password" name="password">
        </label>
        <!-- TO-DO:
            Dropdown list con los diferentes tipos de usuarios, i.e.: admin, secretario, etc.
        -->
        <input type="submit" id="registerButton" class="button small">Finalizar registro</a>
    </fieldset>
</form>

每当我尝试创建新用户时,都会收到以下错误:

ArgumentError - wrong number of arguments (4 for 0..2)

考虑到我尝试插入值的表有 4 列,我不明白为什么会出现此错误。

任何能帮助我解决这个不便的见解将不胜感激!

提前致谢。

【问题讨论】:

    标签: mysql ruby activerecord sinatra


    【解决方案1】:

    ActiveRecord::new 方法只允许 2 个参数作为参数,它应该是一个哈希。修复:

    User.new(params[:nombre], params[:cedula], password_hash, "admin")
    

    到:

    User.new(nombre: params[:nombre], cedula: params[:cedula], password: password_hash, role: "admin")
    

    您应该经常检查文档,在 99% 的情况下您可以发现问题:

    新对象可以被实例化为空的(不通过构造 参数)或预先设置属性但尚未保存 (传递哈希 键名与关联的表列名匹配)。同时 实例,有效的属性键由列名确定 关联的表——因此你不能拥有不属于的属性 部分表格列。

     new(attributes = nil, options = {})
    

    例子:

    # Instantiates a single new object
    User.new(:first_name => 'Jamie')
    
    # Instantiates a single new object using the :admin mass-assignment security role
    User.new({ :first_name => 'Jamie', :is_admin => true }, :as => :admin)
    
    # Instantiates a single new object bypassing mass-assignment security
    User.new({ :first_name => 'Jamie', :is_admin => true }, :without_protection => true)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多