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
ますか?
ご助力いただきありがとうございます