0

我是 RoR 菜鸟,正在使用 rails 3.2.3。

我一直在使用设计,到目前为止它一直很棒,但是,我遇到了一个问题。

我有一个User带有设计的表和一个与角色表的 HABTM 关联。我创建了连接表,一切都很好。当我创建一个用户并选择它的角色时,它会正确地在连接表中创建数据。

但是,我激活了设计的confirmable选项,事情开始出错。当我创建一个新用户时,它不再按应有的方式在连接表中插入记录。

我的意思是,我所做的所有文字工作都是, :confirmable在其他设计选项之前添加,例如:database_authenticatable, :recoverable, :rememberable, :trackableand :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 激活时遇到了这个问题?

感谢你的帮助

4

1 回答 1

2

t.confirmable 不再受支持,请使用此迁移

   ## Confirmable
  # t.string   :confirmation_token
  # t.datetime :confirmed_at
  # t.datetime :confirmation_sent_at
  # t.string   :unconfirmed_email
于 2012-08-14T15:44:11.253 回答