我是 RoR 菜鸟,正在使用 rails 3.2.3。
我一直在使用设计,到目前为止它一直很棒,但是,我遇到了一个问题。
我有一个User
带有设计的表和一个与角色表的 HABTM 关联。我创建了连接表,一切都很好。当我创建一个用户并选择它的角色时,它会正确地在连接表中创建数据。
但是,我激活了设计的confirmable
选项,事情开始出错。当我创建一个新用户时,它不再按应有的方式在连接表中插入记录。
我的意思是,我所做的所有文字工作都是, :confirmable
在其他设计选项之前添加,例如:database_authenticatable, :recoverable, :rememberable, :trackable
and :validatable
。
当我激活时,:confirmable
我写了这个迁移(我也看到堆栈溢出):
class AddConfirmableToDeviseV < ActiveRecord::Migration
def change
change_table(:users) do |t|
t.confirmable
end
add_index :users, :confirmation_token, :unique => true
end
end
它会发送带有确认链接的电子邮件,这没有错,但是当我单击它时,应用程序会中断,因为该用户没有分配给它的角色,这是必须的。
正如我所说,我所做的只是添加:confirmable
. 如果我在我的用户模型中这样注释掉它,#,:confirmable
角色和用户数据就会正确地插入到连接表中。
这是怎么回事?有小费吗?
提前致谢,
问候
更新
@凯尔C
我正在使用常规操作创建用户:
看法:
<div class="field">
<%= f.label :username %><br />
<%= f.text_field :username %>
</div>
(...)
<% for role in Role.find(:all) %>
<div class="field">
<%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %>
<%= role.name %>
</div>
<%end%>
然后在我的控制器中:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(@user, :notice => 'User was successfully created.') }
(...)
没有:confirmable
,这足以在连接表中输入数据。
最重要的是,我的应用程序控制器中有这个:
def after_sign_in_path_for(resource)
if current_user.roles.first.id == 1
admin_dashboard_path
elsif current_user.roles.first.id == 2
manage_path
end
end
如果我把它拿出来,用户在点击确认电子邮件时会登录,但是,中间连接表仍然没有得到关联。
我浏览了文档(https://github.com/plataformatec/devise/blob/master/lib/devise/models/confirmable.rb),但我还是个菜鸟,我也没有找到任何可以覆盖我的应用程序的初始行为。
创建用户后,有没有办法强制输入联接表中的记录?
我试过这个:
def create
@user = User.new(params[:user])
@role = Role.find(params[:user][:role_ids])
if @user.save
@user.role << @role
@user.save
AND(做错事但仍然没有成功)
(...)
if @user.save
query = ActiveRecord::Base.connection.raw_connection.prepare("INSERT INTO roles_users (role_id, user_id) VALUES (?,?);")
query.execute(@role.id, @user.id)
query.close
这真是令人沮丧,其他人在:confirmable
使用 HABTM 激活时遇到了这个问题?
感谢你的帮助