我是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
答案 0 :(得分:2)
与has_and_belongs_to_many
和User
之间的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