在我的注册视图页面中我的collection_select有什么问题

时间:2013-06-20 08:36:45

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我是rails的新手,

我正在使用ryan bates视频教程的设计,而且,我被困在某一点

我创建了用户,角色关系

在注册页面中,我需要为现有角色提供选择选项组,

在我正在撰写的注册视图页面

<%= collection_select(:user,:roles,Role.find(:all),:id,:name) %>

我没有准确理解collection_select方法,请帮助我可能做错了

我的模特1:user.rb

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me , :roles

  has_and_belongs_to_many :roles

  def role?(role)
    return !!self.roles.find_by_name(role.to_s.camelize)
  end
end

我的模型2:role.rb

class Role < ActiveRecord::Base
  attr_accessible :name
  has_and_belongs_to_many :users
end

我的用户迁移文件

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              :null => false, :default => ""
      t.string :encrypted_password, :null => false, :default => ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, :default => 0
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
  end
end

我的角色迁移文件

class CreateRoles < ActiveRecord::Migration
  def change
    create_table :roles do |t|
      t.string :name

      t.timestamps
    end
  end
end

我的联接表迁移文件

class UsersHaveAndBelongToManyRoles < ActiveRecord::Migration
  def up
    create_table :roles_users, :id => false do |t|
      t.references :role, :user
    end
  end

  def down
    drop_table :roles_users
  end
end

ERROR COMING是 未定义的方法`each'表示“2”:字符串

2是所选角色的ID

1 个答案:

答案 0 :(得分:2)

has_and_belongs_to_manyUser之间的Role关系一样,role_id对象上没有User

collection_select的第二个参数是您使用选择更新的属性,在您的情况下,它不是role_id,而是role_ids并且看到它是{您可能希望允许用户选择多个选项的{1}}关系,请尝试以下操作:

has_and_belongs_to_many

如果您将其附加到<%= collection_select(:user, :role_ids, Role.all, :id, :name, {}, { selected: @user.role_ids, multiple: true }) %> 对象上的form_for,则可以使用:

@user