Railstutorial.org 第 6 章 User.new(名称: "name") returns 无

Railstutorial.org Chapter 6 User.new(name: "name") returns nil

我现在正在制作 Michael Harls 教程。在第 6 章中,我在沙盒控制台中创建新用户。当我创建一个新用户时,图片显示了发生的情况。返回了一个新对象,但名称和电子邮件为零,尽管我设置了属性,如您所见。当我访问属性 vie user.name 时 returns name.Can 有人向我解释一下吗?

谢谢 塞巴斯蒂安

型号 user.rb

class User < ApplicationRecord
    attr_accessor :name, :email
end

user_controller.rb

class UsersController < ApplicationController
  def new
  end


end

_create_users.rb

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

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

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

在 Synthesis 中,您没有在 users_controller 中声明 strong params 或在 user 模型中声明 attr_accessor

对于 rails 版本直到 3

您需要在模型中定义一个 attr_accessor user class

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 class 有特殊的方法。 .require() 仅选择 params 哈希中的 user 对象,permit 使 nameemail 字段可读。

这是关于 strong params and in 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