7

サインアップにdeviseでレールを使用しています。また、招待コードを追加したので、誰もがサインアップできるわけではありません.

招待コードは、「/users/sign_up?invite_code=wajdpapojapsd」のようなクエリ文字列を介して送信され、「f.hidden_​​field :invite_code, :value => params[:invite_code]」でサインアップ フォームの隠しフィールドに追加されます。 "。

これはかなりうまくいきます。唯一の問題は、サインアップが検証および拒否されない場合、devise が「/users」にリダイレクトされ、invite_code を含むクエリ文字列が失われることです。

試行が失敗した後も電子メールはサインアップ フォームに残っているため、これは招待コードでも機能するはずです。最悪の場合の解決策として、サインアップに失敗した後に :back をリダイレクトして電子メールを失い、招待コードを保持することは、現在の方法よりも優れています.

編集:これまでに、デバイス用の登録コントローラーをセットアップしましたが、目的の動作を取得する方法がわかりません。

クエリ文字列または招待コードだけを保持する方法についてのヘルプは素晴らしいでしょう.

4

4 に答える 4

10

私は今までに実用的な解決策を見つけました。

jstr の回答を使用して、デバイス用のコントローラーをセットアップし、「セッション」行を追加しました。

class MyRegistrationsController < Devise::RegistrationsController
  prepend_view_path "app/views/devise"

  def create
    super
    session[:invite_code] = resource.invite_code
  end

  def update
    super
  end
end

その後、devise/registrations/new.html.erb に以下を追加しました

<% if params[:invite_code]
  @invite_code = params[:invite_code]
else
  @invite_code = session[:invite_code]
end %>

そして、hidden_​​field を次のように変更しました

<%= f.hidden_field :invite_code, :value => @invite_code %>
于 2012-08-12T13:10:13.537 に答える
1

@James Lever のソリューションには、1 つの欠点があります。招待コードはセッションに残ります。一部のソリューションでは、問題が発生する可能性があります。別の解決策は次のとおりです。

def create
  # set invite code to session:
  session[:invite_code] = resource.invite_code
  # here the form is rendered and invite code from session would be used:
  super

  # delete invite code from session: 
  session.delete('invite_code')
end
于 2016-02-25T13:03:38.687 に答える
1

これを機能させるには、独自のサブクラス化された Devise コントローラーを作成する必要がある場合があります。

この回答には、これを行う方法についての適切な説明があります。

基礎:

  1. Devise ビューをまだインストールしていない場合はインストールしますrails generate devise:views
  2. サブクラスを作成するDevise::RegistrationsController
  3. Devise ルート宣言を更新して、Devise がサブクラス化されたコントローラーを使用するようにします
于 2012-08-11T12:01:25.383 に答える
0

なぜそのようなインスタンス変数を使用しないのですか

@invite_code = params[:invite_code]

次に、サインアップが検証に合格しなかった場合、失敗したサインアップに対して表示されるビューでその変数を使用できます。

つまり、リダイレクトされる前に、招待コードのパラメーターをインスタンス変数で保持する必要があります。間違っていたらごめんなさい。

于 2012-08-11T13:04:42.040 に答える