0

RoR 新人で、Rails 3.2.3 を使用しています。

私はdeviseを使用してきましたが、これまでのところ素晴らしいものでしたが、問題が発生しました。

devise を含むUserテーブルと、Role テーブルとの HABTM 関連付けがあります。結合テーブルを作成しましたが、すべて問題ありません。ユーザーを作成してそのロールを選択すると、結合テーブルにデータが正しく作成されます。

confirmableしかし、デバイスのオプションを有効にしたところ、問題が発生し始めました。新しいユーザーを作成すると、結合テーブルにレコードが挿入されなくなりました。

つまり、私が文学的に行ったことは、や, :confirmableなどの他のデバイスオプションの前に追加することだけでした。:database_authenticatable, :recoverable, :rememberable, :trackable: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。User モデルでこのようにコメントアウトすると#,: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

これは本当にイライラします。HABTM でアクティブ化するときに、この問題を思いついた人はい:confirmableますか?

ご助力いただきありがとうございます

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 に答える