#ruby-on-rails #ruby #ruby-on-rails-3 #devise #simple-form
#ruby-on-rails #ruby #ruby-on-rails-3 #разработка #простая форма
Вопрос:
В моей базе данных я вижу, что связь между пользователем и ролями не создается.
Вот моя форма:
<div style="margin-left:40px;float:left;width:620px;">
<h2>Create User</h2>
<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= f.input :username, :label => 'Brugernavn' %>
<%= f.input :email, :label => 'E-mail' %>
<%= f.input :password, :label => 'Kodeord' %>
<%= f.input :password_confirmation, :label => 'Bekræft kodeord' %>
<%= f.association :roles, :label => 'Role', :as => :check_boxes, :collection => ['admin', 'user', 'manager'] %>
<%= f.submit 'Opret bruger' %>
<% end %>
Моя модель пользователя:
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
make_voter
has_many :posts
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates_presence_of :username, :password, :password_confirmation, :email
validates_uniqueness_of :username, :email
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me, :username
end
Мой образец для подражания:
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
end
Я создал объединенную таблицу role_users.
Параметры отправки формы:
Started POST "/users" for 127.0.0.1 at 2011-10-20 13:10:06 0200
Processing by Devise::RegistrationsController#create as HTML
Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"4tDVvIWOGBEmQpk/Vr9k8huIdB1
ghXxNGEcJDj uuZk=", "user"=>{"username"=>"sometest", "email"=>"sometestemail@hot
mail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "rol
e_ids"=>["", "", "user", ""]}, "commit"=>"Opret bruger"}
←[1m←[35mSQL (7.0ms)←[0m describe `roles_users`
WARNING: Can't mass-assign protected attributes: role_ids
←[1m←[36mSQL (1.0ms)←[0m ←[1mBEGIN←[0m
←[1m←[35mSQL (2.0ms)←[0m SELECT 1 FROM `users` WHERE (`users`.`email` = BINAR
Y 'sometestemail@hotmail.com') LIMIT 1
←[1m←[36mSQL (1.0ms)←[0m ←[1mSELECT 1 FROM `users` WHERE (`users`.`username`
= BINARY 'sometest') LIMIT 1←[0m
←[1m←[35mCACHE (0.0ms)←[0m SELECT 1 FROM `users` WHERE (`users`.`email` = BIN
ARY 'sometestemail@hotmail.com') LIMIT 1
←[1m←[36mSQL (6.0ms)←[0m ←[1mdescribe `users`←[0m
←[1m←[35mAREL (0.0ms)←[0m INSERT INTO `users` (`email`, `encrypted_password`,
`reset_password_token`, `reset_password_sent_at`, `remember_created_at`, `sign_
in_count`, `current_sign_in_at`, `last_sign_in_at`, `current_sign_in_ip`, `last_
sign_in_ip`, `created_at`, `updated_at`, `username`) VALUES ('sometestemail@hotm
ail.com', '$2a$10$g.c.4kawWiEPDalKDwxqr.ZvvYx769t2arVKUcQh9kcv9Jf5tdFoe', NULL,
NULL, NULL, 0, NULL, NULL, NULL, NULL, '2011-10-20 11:10:06', '2011-10-20 11:10:
06', 'sometest')
←[1m←[36mSQL (54.0ms)←[0m ←[1mCOMMIT←[0m
←[1m←[35mSQL (1.0ms)←[0m BEGIN
←[1m←[36mAREL (1.0ms)←[0m ←[1mUPDATE `users` SET `last_sign_in_at` = '2011-10
-20 11:10:06', `current_sign_in_at` = '2011-10-20 11:10:06', `last_sign_in_ip` =
'127.0.0.1', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 1, `updated_
at` = '2011-10-20 11:10:06' WHERE `users`.`id` = 9←[0m
←[1m←[35mSQL (1.0ms)←[0m COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 287ms
Ответ №1:
Добавить
accepts_nested_attributes_for :roles
Для вашей User
модели.
Также будьте осторожны с attr_accessible
, поскольку он заблокирует все атрибуты, которые не разрешены. Возможно, потребуется добавить :roles
туда (но не совсем уверен в этом).
Комментарии:
1. Я добавил идентификаторы ролей в attr_accessible