select_tag选项应该从另一个表中获取数据

时间:2014-06-16 12:54:09

标签: ruby-on-rails ruby html-select

我正在修改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'

4 个答案:

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