Railstutorial.org第6章User.new(名称:"名称")返回nil

时间:2017-11-18 17:58:09

标签: ruby-on-rails railstutorial.org

enter image description here我正在研究Michael Harls turtorial。在第6章中,我将在沙盒控制台中创建新用户。当我创建一个新用户时,图片显示了会发生什么。返回一个新对象,但名称和电子邮件是nil虽然我设置了属性,你可以看到。当我访问attibutes vie user.name时,它返回名称。任何人都可以向我解释这个吗?

谢谢 塞巴斯蒂安

模型 user.rb

BOOL Sdialog::PreTranslateMessage(MSG* pMsg)
{
    BOOL    bNoDispatch, bDealtWith;

    bDealtWith = FALSE;

    if (IsCTRLpressed() &&
        pMsg->message == WM_KEYDOWN && pMsg->wParam == _TINT(_T('A')))
    {
        // Deal with it

        // Eat it.
        bNoDispatch = TRUE;
        bDealtWith = TRUE;
    }

    if (!bDealtWith)
        bNoDispatch = CDialogEx::PreTranslateMessage(pMsg);

    return bNoDispatch;
}

user_controller.rb

class User < ApplicationRecord
    attr_accessor :name, :email
end

_create_users.rb

class UsersController < ApplicationController
  def new
  end


end

enter image description here

1 个答案:

答案 0 :(得分:1)

从您的应用服务器执行的查询中,我了解到您的问题与parameters sanitazion

相关联
INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2017-11-18"],["updated_at","2017-11-17"]]

在综合中,您未在strong paramsusers_controller模型中的attr_accessor声明user

rails

之前的3个版本

您需要在模型attr_accessor

中定义user

user.rb

class User
    attr_accessor :name, :email
end

现在,如果你User.new(name: 'Fabrizio Bertoglio', email: 'fabrizio.developer@gmail.com'),你应该能够写下这些属性

了解更多信息请阅读

usage of attr_accessor in Rails

如果您使用rails >= 3

您需要在控制器中将strong_params声明为私有方法

users_controller.rb

class UsersController
    def create
       @user = User.new(user_params)
       # the rest of the logic
    end

    private
    def user_params
        params.require(:user).permit(:name, :email)
    end
end

params是一个哈希,ActionController:Parameters是一个新的Rails类,它有特殊的方法。 .require()仅选择user哈希中的params对象,permit使nameemail字段可读。

这是关于strong paramsin the api的文档,您有更多信息。

Sanitize your params

打开你的控制台并创建你的参数

params = ActionController::Parameters.new({
  user: {
    name: "Francesco",
    email:  "francesco@email.com"
  }
})

然后您require user对象和permit nameemail属性

permitted = params.require(:user).permit(:name, :email)

现在,如果您在控制台中输入permitted,则输出应为

<ActionController::Parameters {"name"=>"Francesco", "email"=>"francesco@email.com"} permitted: true>

permitted字段必须为true

user = User.new(permitted)

应该有效,原因是你在控制台中所做的是:

user = User.new()

因为您传递的name:email不是sanitized,所以从技术上讲,您什么也没有通过。这就是你需要控制器中的strong_params

的原因