Why don't the User accounts created in my app remember the Role selected for them on sign up?
Hopefully someone can help me on this one, it's absolutely driving me crazy!
Basically, I have created an Authentication system on my app, using Devise and CanCan, which works fine. The problem arises when I try to assign a Role to a User on signup, the Users Role does not save, the sign-up is successful, but the User has no assigned Role. In my Console the Users Role comes up as nil!
I've set up a HABTM association between Users and Roles, and tried various options. Rails Console returns User Role:nil even if I input the role as a String in the sign-up form.
I am new to Rails and programming in general, would really appreciate some assistance people! Many Thanks in
User Model:
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :username, :password, :password_confirmation, :remember_me, :role_ids
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
end
Snippet from New Registration View:
<fieldset>
<legend>Sign Up</legend>
<div class="inputs">
<%= f.input :username, :required => true, :autofocus => true %>
<%= f.input :email, :required => false, :autofocus => true %>
<%= f.i开发者_运维技巧nput :password %>
<%= f.input :password_confirmation, :label => "Confirm Password" %>
</div>
<div>
<%= f.input :roles, :required => true, :collection => Role.find(:all).collect {|c| [ c.name, c.id ]}, :label => "Role" %>
</div>
Params
Processing by Devise::RegistrationsController#create
as HTML Parameters: {"commit"=>"Sign up", "authenticity_token"=>"1HCmfOVATkz/LbALboU+Z2Bg/lBQseVNB2NeAG7GPHc=", "utf8"=>"✓", "user"=>{"password_confirmation"=>"[FILTERED]", "username"=>"test", "role_ids"=>["2"], "password"=>"[FILTERED]", "email"=>"test@test.com"}}
[1m[35mRole Load (0.1ms)[0m SELECT "roles".* FROM "roles" WHERE "roles"."id" = 2 LIMIT 1 [1m[36mSQL (0.1ms)[0m [1mSELECT 1 FROM "users" WHERE ("users"."email" = 'test@test.com') LIMIT 1[0m
[1m[35mAREL (0.3ms)[0m INSERT INTO "users" ("reset_password_token", "role", "email", "remember_created_at", "current_sign_in_ip", "encrypted_password", "updated_at", "created_at", "sign_in_count", "username", "last_sign_in_at", "reset_password_sent_at", "last_sign_in_ip", "current_sign_in_at") VALUES (NULL, NULL, 'test@test.com', NULL, NULL, '$2a$10$8J6F2NgkK6Tas0AVMiocUujimZ7K3XcYFSmWGeYUzmGDN55WVUHxO', '2011-07-10 23:30:45.820893', '2011-07-10 23:30:45.820893', 0, 'test', NULL, NULL, NULL, NULL) [1m[36mSQL (0.1ms)[0m [1mINSERT INTO "roles_users" ("role_id", "user_id") VALUES (2, 33)[0m [1m[35mAREL (0.1ms)[0m UPDATE "users" SET "current_sign_in_ip" = '127.0.0.1', "updated_at" = '2011-07-10 23:30:45.827053', "sign_in_count" = 1, "last_sign_in_at" = '2011-07-10 23:30:45.826761', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_at" = '2011-07-10 23:30:45.826761' WHERE "users"."id" = 33Redirected to http://localhost:3000/ Completed 302 Found in 163ms
After many investigations, this question raised another question but no real here.
精彩评论