我正在修改Devise的注册表。我为角色维护了单独的表。现在,在我的表单中,我想从注册表单中的角色表中获取所有角色作为下拉选项。我知道需要很少的初始化但不知道如何?我创建了角色列来存储用户表中的角色。在此先感谢:)
以下是查看文件中的代码:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :role %>
<%= f.select_tag "role", options_for_select(@role, @selected_roles) %>
</div>
registrations_controller.rb
class Devise::RegistrationsController < DeviseController
def new
@role = Role.all
build_resource({})
respond_with self.resource
end
模型/ role.rb
class Role < ActiveRecord::Base
has_many :access_module_roles
has_many :access_modules, through: :access_module_roles
scope :active, -> { where(:is_active => true) }
end
错误:
undefined method `map' for nil:NilClass
app/views/devise/registrations/new.html.erb:32:in `block in _app_views_devise_registrations_new_html_erb___501223176_87152360'
app/views/devise/registrations/new.html.erb:3:in `_app_views_devise_registrations_new_html_erb___501223176_87152360'
app/controllers/devise/registrations_controller.rb:20:in `new'
答案 0 :(得分:1)
这应该可以做到(作为单个值)
按照命名约定使用@roles = Role.all
存储角色名称。
<%= f.select(:role, @roles.map{|r| [r.attr, r.attr]}, :include_blank => "Select") %>
存储相应的ID。
<%= f.select(:role, @roles.map{|r| [r.attr, r.id]},:include_blank=> "Select") %>
编辑:
class RegistrationsController < Devise::RegistrationsController
从devise
继承到您的Controller
答案 1 :(得分:1)
试试这个: -
<%= f.select :role, Role.all.collect {|p| [ p.field_name, p.field_name ] }, { :include_blank => "Please select" } %>
答案 2 :(得分:0)
我认为这里有几个问题:
首先是registrations_controller.rb
不要忘记从&lt;设置继承。设计:: RegistrationsController
您的控制器应如下所示:
class RegistrationsController < Devise::RegistrationsController
将您的控制器文件名更改为registrations_controller.rb
我认为你忘了'告诉'设计使用你的自定义控制器,这就是为什么你得到nil的未定义方法图:NillClass
你可以这样做:
devise_for :users, controllers: { registrations: "users/registrations" }
在上面的示例中,自定义 registrations_controller.rb 嵌套在用户模块中,根据您的情况可能会有所不同,只是不添加users
如果您的控制器不在模块中,或者如果您有一个模块,则添加自己的模块。
对于表单助手,最好使用options_from_collection_for_select,因为这里有模型。
<%= f.select_tag "role", options_from_collection_for_select(@role, :id, :name, @selected_roles) %>
希望这有帮助!
答案 3 :(得分:0)
我通过纠正
解决了这个问题 registrations_controller.rb 中的
def new
@roles = Role.all.collect { |m| [m.name, m.id] }
build_resource({})
respond_with self.resource
end
并在我的查看
中<div><%= f.label :role %>
<%= f.select(:role, @roles,:include_blank=> "Select") %>
</div>