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
使 name
和 email
字段可读。
这是关于 strong params and in the api 的文档。您有更多信息。
Sanitize your params
打开控制台并创建参数
params = ActionController::Parameters.new({
user: {
name: "Francesco",
email: "francesco@email.com"
}
})
然后你 require
user
对象和 permit
name
和 email
属性
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
谢谢 塞巴斯蒂安
型号 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
使 name
和 email
字段可读。
这是关于 strong params and in the api 的文档。您有更多信息。
Sanitize your params
打开控制台并创建参数
params = ActionController::Parameters.new({
user: {
name: "Francesco",
email: "francesco@email.com"
}
})
然后你 require
user
对象和 permit
name
和 email
属性
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