在Devise的新注册表单中添加单选按钮

时间:2019-02-27 20:24:02

标签: ruby-on-rails authentication devise radio-button radio-group

我的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.rbdef 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是绊脚石,我敢打赌。)

有人对如何进行有想法吗?

2 个答案:

答案 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...