Spaghetti Rails ルーティングと招待コーディング ボロネーゼ
-
19-09-2019 - |
質問
ここに単一の問題があるのか、それとも間違った方法でこれに取り組んだのかはよくわかりませんが、ご提案をいただければ幸いです。
アプリケーションでは、ユーザーがサインアップすると権限が付与され、ページが設定され、電子メールで同僚を招待できるようになります。
電子メールの最後にはアクティベーション コードがタグ付けされています。URL の例は次のようになります。/ユーザー/新しい/xxxxxxxxx".
問題は次のとおりです。 同僚が基本情報だけでユーザー アカウントを作成できるようにして、アカウントにログインしてアプリのコーナーを設定できるようにする必要があります。
同僚がユーザー サインアップ フォームで間違いを犯すと、URL はアクティベーション コードがあることを忘れ、検証メッセージと「/users」というまったく素の URL を表示して戻ります。同僚が間違いを修正してサインアップをクリックすると、招待された同僚ではなく、正式なユーザーとして送信されます。
これは、「users/new」ページに if 句があるために発生します。
<% if @activation_code %>
Show colleague messages of invitation and happiness
<% else %>
Show fully fledged user ego stroking messages
<% end %>
URLのコードパラメータを見つけるための私のルーティングは次のとおりです。
map.signup '/users/new/:code', :controller => 'users', :action => 'new', :code => nil
前にも言ったように、私のアプローチは完全に間違っていたのでしょうか?ここに問題が 1 つありますか?
アップデートこの Rails Cast エピソードは、私が抱えていた問題のほぼすべてを解決しました。 ベータ版への招待状
ただし、その人が招待から来たのかどうかを区別するために、次の条件ブロックを使用しました。
if !@user.invitation_id.blank?
そしてそれはうまくいきました。
解決
あなたのコントローラーは次のようになっていると思います:
def create
if @user = User.create(params[:user]) && @user.new_record?
#take the user to where you want them to go
else
#there was an error
flash[:error] = "Oops, blah blah blah"
render :action => "new"
end
end
問題は、ビューに @activation_code が存在しないことです。したがって、activation_code を非表示のフォーム フィールドに戻すことをお勧めします。
def create
@activation_code = params[:activation_code]
if @user = User.create(params[:user]) && @user.new_record?
#take the user to where you want them to go
else
#there was an error
flash[:error] = "Oops, blah blah blah"
render :action => "new"
end
end
こうすることで、作成アクションから「新しい」ビューをレンダリングするときに、ビューには適切な条件要素をレンダリングするために必要な @activation_code が引き続き含まれます。
他のヒント
ユーザーが確認コードを使用してページにアクセスしたら、そのページに確認コードを含めることを検討するかもしれません。 <input type="hidden" />
タグを使用して、ポストバック間で保存されるようにします。
それ以外の場合は、サインアップ フォームのアクションを変更してアクティベーション コードを含める必要があります。このようなもの:
form_for @user, :url => "/users/new/#{@activation_code}" do |f|
# ...
end