【发布时间】:2021-11-04 18:12:20
【问题描述】:
我正在构建一个应用程序,其中有两种类型的用户,member 和 business_event。我正在努力实现这一点。我有一个用户的注册表单,他们可以从下拉菜单中选择他们是“会员”还是“企业或活动”。当我尝试注册特定角色时,我的 Rails 控制台总是显示“角色”是“成员”(我分配的默认值)。
在我的 Rails 后端,我添加了设计 gem 和此迁移:
class AddRoleToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :role, :integer
end
end
然后我将 User 模型更改为以下内容:
class User < ApplicationRecord
has_secure_password
enum role: [:member, :business_event]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :member
end
end
在我的 react 前端,这是我想用来注册用户的表单:
import React from 'react'
import { connect } from 'react-redux'
import { updateSignupForm } from "../../actions/signupForm.js"
import { signup } from "../../actions/currentUser.js"
const Signup = ({ signupFormData, updateSignupForm, signup }) => {
const handleUserInfoInputChange = event => {
const { name, value } = event.target
const updatedFormInfo = {
...signupFormData,
[name]: value
}
updateSignupForm(updatedFormInfo)
}
const handleSubmit = event => {
event.preventDefault()
signup(signupFormData)
}
return (
<div>
<h1>Sign Up </h1>
<form onSubmit={handleSubmit}>
<div className="ui input">
<select>
<option value={signupFormData.role}>Member</option>
<option value={signupFormData.role}>Business or Event</option>
</select>
<input placeholder="username" value={signupFormData.username} name="username" type="text" onChange={handleUserInfoInputChange} />
<input placeholder="password" value={signupFormData.password} name="password" type="text" onChange={handleUserInfoInputChange} />
<input placeholder="email" value={signupFormData.email} name="email" type="text" onChange={handleUserInfoInputChange}/><br/><br/>
<button className="button button-signup" type="submit" value="Sign Up" > Sign up</button>
</div>
</form>
</div>
)
}
const mapStateToProps = state => {
return {
signupFormData: state.signupForm
}
}
export default connect(mapStateToProps, { updateSignupForm, signup } )(Signup)
在我的signupForm reducer 中,我决定将“role”的初始值设置为“0”,因为它在后端是一个整数。我不确定这是否是我出错的地方:
const initialState = {
username: "",
password: "",
email: "",
role: 0
}
export default (state=initialState, action) => {
switch (action.type) {
case "UPDATE_SIGNUP_FORM":
return action.formData
case "RESET_SIGNUP_FORM":
return initialState
default:
return state
}
}
我不确定为什么用户总是恢复为“成员”的默认角色。任何帮助将不胜感激。
【问题讨论】:
-
检查后端是否需要“0”或“1”形式的角色。它实际上是这样发生的。
-
是的,我查过了。当我在控制台中运行 User.roles 时,我得到了
User.roles => {"member"=>0, "business_event"=>1} -
相关控制器在做什么?角色如何传递给用户模型?
-
是的 - 你的前端应该只使用字符串值,只有后端模型/数据库应该知道它们映射到的数值。见edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
-
非常感谢您
标签: reactjs ruby-on-rails devise authorization roles