我的Ruby on Rails应用程序使用Devise进行用户身份验证。虽然我可以很轻松地将字段添加到默认注册表单中,但是我是新手,并且单选按钮没有运气。
每个:user
是一个:teacher
或:student
(实际上,user
表是自联接的)。因此,当前的工作注册要求注册人员在“位置”文本字段中键入“学生”或“教师”。自然,即使功能正常,它也不友好,所以我想用两个单选按钮替换该文本字段。
我尝试过的事情:
在users.rb
模型中,我添加了一个常量:
POSITIONS = [
["student", "Student"],
["teacher", "Teacher]
]
对于devise/registrations/new.html.erb
,我将域代码更改为:
<div class="radio">
<%= f.label :position, 'Position', :class => 'position-button' %><br />
<div class="input-form">
<%= f.collection_radio_buttons(:position, @positions_collection, :first, :last) %>
</div>
</div>
然后我进入控制器。据我所知,如果Devise不是我的应用程序的一部分,我将因此调用POSITIONS
中的users_controller.rb
常量:
def new
@user = User.new
@positions_collection = User::POSITIONS
end
但是,通过Devise自动生成的users_controller.rb
在def new
中没有任何内容,但似乎依赖于文件底部的自定义方法来处理新用户:
def resource_name
:user
end
def resource
@resource ||= User.new
end
def resource_class
User
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
所以我开始尝试,首先将@positions_collection = User::POSITIONS
添加到def new
。重新加载注册页面返回以下错误:“ NoMethodError in Devise :: Registrations#new
[snip]第30行出现了:nil:NilClass的未定义方法'map'。无论我尝试在控制器中的哪个地方@positions_collection = User::POSITIONS
,甚至在自定义方法中,都会反复出现此错误。甚至与@user = User.new
结合使用。
(第30行引用视图文件中的<%= f.collection_radio_buttons(:position, @positions_collection, :first, :last) %>
,这表明@positions_collection
是绊脚石,我敢打赌。)
有人对如何进行有想法吗?
答案 0 :(得分:0)
据我了解,您使用字符串列存储用户类型。更好的选择是使用整数列position
和枚举来表示用户的角色:
class User < ApplicationRecord
enum position: [:student, :user]
...
end
然后在您的表单中,您可以映射枚举中的值:
<%= f.select(:position, User.positions.keys.map {|position| [position.titleize,position]}) %>
这将是更清晰的解决方案。
答案 1 :(得分:0)
nil类的问题是因为未在“ create”方法中定义:
@positions_collection = User::POSITIONS
最简单的解决方案是删除此变量,然后在视图中直接使用User::POSITIONS
。
<% User::POSITIONS.map...