アップデート
この投稿の最後に記載されている質問をさらに明確にしました。
問題の概要:
トークン認証を含む電子メールで送信された URL を介して、Devise で遅延 (別名ソフト サインアップ) 登録を実装しようとしています。私のサイトでは、User
has_many :payments
、およびPayment
belongs_to :user
. がUser
新しい を作成すると、新しい未登録ユーザー (「ゲスト」と呼びます) を表すPayment
属性が含まれます。:email
ActionMailer を使用して、この新しいゲストにメールを送信します。
送信されるこの電子メールには、トークン認証を含む URL (例: ) を含めたいと考えていますhttp://localhost/index?auth_token=TOKENVALUE
。これにより、ゲストは、認証が必要なビューを表示および編集でき、(ゲストの に基づいて:email
) 特別にカスタマイズされます。ゲストは、として登録することもUser
できます。私はすでにメール アドレスを持っているので、パスワードを入力するだけで済みます。
これまでの進捗状況:
- Devise を使用して誰かがサイトに登録できる機能を実装し、関連付けられたビュー、モデル、およびコントローラーを作成して、
Payment
モデルに変更を加えました。 - 私は ActionMailer をセットアップし、それを使用して電子メールを送信していますが、上記のユースケースを考えると、その方法がわからないため、まだトークン認証をセットアップしていません
関連リソース:
- https://github.com/plataformatec/devise/wiki/How-To:-Simple-Token-Authentication-Example
- http://zyphdesignco.com/blog/simple-auth-token-example-with-devise
- Ruby On Rails を使用した複数のユーザー モデルと、個別の登録ルートと 1 つの共通ログイン ルートを持つように工夫する
- Rails 3 + Devise でゲストユーザーを作成する方法
- https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user
- http://blog.bignerdranch.com/1679-lazy-user-registration-for-rails-apps/
- http://railscasts.com/episodes/393-guest-user-record?view=asciicast
- https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface
- Rails 3 - Devise Gem - CRUD インターフェイスを介してユーザーを管理する方法
- http://danielboggs.com/articles/rails-authentication-and-user-management-via-crud/
/app/models/payment.rb
class Payment < ActiveRecord::Base
attr_accessible :amount, :description, :email, :frequency, :paid, :user_id
belongs_to :user
validates :email, :presence => true, :format => { :with => /.+@.+\..+/i }
validates :amount, :presence => true
validates :description, :presence => true
end
/app/models/user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
# I will also need to add ":token_authenticatable"
attr_accessible :email, :password, :password_confirmation, :remember_me
has_many :payments
end
質問:
- テーブルで作成された新しいものがテーブルに自動的に追加されるように、テーブルを作成された
User
新しいものと同期させるにはどうすればよいですか?Payments
:email
Payment
User
:email
- 質問 1 に続いて
User
、ユーザーはまだサイトに登録していないため、新しく作成されたものにはトークンが含まれている必要がありますが、パスワードは含まれていません。User
空白のパスワード、ランダムに生成された文字列、またはその他を使用して新しいパスワードを作成する必要がありますか? いずれの場合も、トークン認証された URL から登録ページにアクセスして、他のユーザーが自分のメール ユーザー名で登録できないようにする必要があると思います (遅延登録など)。 - 質問 2 に続いて、ユーザーのタイプによって一部のビューが変わるため、ゲストと通常のユーザーを区別する必要があると思います。2 つのユーザー タイプを区別するために 0 または 1 を持つ列を追加する以外に、推奨される方法はありますか?
含まれている多くの機能を使用しているため、可能であればDeviseを使用することを好みます。私は RoR を初めて使用するので、アドバイスをいただければ幸いです。
編集:これは、他の誰かに役立つ場合に備えて、支払いコントローラーで上記の質問#1に対処するために使用したコードです
def create
@payment = current_user.payments.build(params[:payment])
#Here is the code I added to keep User :email in sync with Payment :email, without token authentication implemented yet
unless User.find_by_email(params[:payment][:email].downcase)
u = User.new({:email => params[:payment][:email].downcase, :password => nil, :password_confirmation => nil })
u.skip_confirmation!
u.save(:validate => false) #skip validation
end
respond_to do |format|
if @payment.save
format.html { redirect_to payments_url, :flash => { notice: 'Payment was successfully created.' } }
format.json { render json: @payment, status: :created, location: @payment }
else
format.html { render action: "new" }
format.json { render json: @payment.errors, status: :unprocessable_entity }
end
end
end