2

サブドメインであるイベント ページにアクセスするために、ユーザーがサインイン (current_user) する必要がある Rails 3.2 アプリがあります。認証にdeviseを使用しています。

イベント ページへの直接リンクを提供した場合、イベント ページへの 1 回限りのアクセスをユーザーに許可する方法はありますか? 次に、別のイベント ページにアクセスしようとした場合、または離れて同じイベント ページに戻ってきた場合に、サインイン (またはサインアップ) するように求められるようにしたいと考えています。

railscastsでゲスト アカウントのエピソードを見たことがありますが、ユーザーはこの方法でサインアップしなくてもゲストとしてログインし続けることができるようです。

これが私のイベントコントローラーコードです:

def show
    @event = Event.find_by_name(request.subdomain)
    if params[:id].present?
      @event = Event.find(params[:id])
    end
    # if @event.present? and @event.videos.present?
      @video = Video.find_by_id(params[:video]) || @event.videos.first
    # else 
    #   @video = @event.videos.first
    # end
    # @json = Event.all.to_gmaps4rails 
    if @user = current_user
    else 
      flash[:alert] = "Please sign in first"
      redirect_to sign_up_url(:subdomain => false)
    end
end

ヘルプ/アドバイスをありがとう...

編集:もう少しコンテキストを提供するために:

  1. 毎週、この 1 つのイベント ページに多くのユーザーを誘導しようとしていますが、ソーシャル メディアやメールなどで 1 つのリンクを送信するだけの場合、個別のハッシュを URL にハードコードすることが可能/実際的かどうかはわかりません。 .

  2. ユーザーはこのリンクをクリックして問題のページに直接移動するため、別のゲスト モデルを作成するためのアクションはトリガーされないため、既存のユーザー モデルにいくつかの列を追加して、セッション ベースで回答する必要があると思います。ただし、ユーザーごとに 1 回だけ使用されるようにします。おそらくIPアドレスが機能すると思いますか?

4

5 に答える 5

4

セッション変数を設定するのではなく、1 つの解決策は、次のように、URL を使用してワンタイム ハッシュをハードコーディングすることです。

http://site.com/event?access_id=AKJHDA23fdsank

その後、イベントにアクセスすると、アクセス コードが削除されます。これには、データベースでアクセス コードを管理する必要がありますが、誰にでもできるという追加の利点があります。

これらのリンクを生成するための API URL を非常に簡単に作成して、共有プロセスを簡素化できます。

他のほとんどすべては簡単にだまされます。

于 2013-08-28T20:27:46.330 に答える
3

最も先見の明のある解決策は、ゲスト ユーザーがページを訪問したかどうかを示すブール値を含むセッション変数を作成することです (その結果、訪問していない場合はアクセスを有効にし、その逆も同様です)。

# in your controller
before_filter :check_guest, :only => :show

private

def check_guest
  # if user isn't logged in
  if current_user.nil? 
    # if user has already viewed, redirect
    if session[:viewed] == true
      flash[:alert] = "Please sign in first"
      redirect_to sign_up_url(:subdomain => false)
    # if user hasn't viewed, allow access, but flag as having viewed
    else
      session[:viewed] = true
    end
  end
end

セッションを使用することは、この特定の問題に対する事実上のアプローチですが、その実装には制限があります。

  • ゲスト アクセスを追跡するには、セッションが有効なままである必要があります
  • ブラウザ固有 (したがって、ブラウザ上の複数のユーザーが同じセッションを共有します)
于 2013-08-28T20:19:02.290 に答える
1

ブール値を設定するには、feature_flags gem を使用できます。

https://rubygems.org/gems/feature_flags

于 2013-08-28T20:24:32.950 に答える
0

これは、zeantsoi のソリューションを少し変更したバージョンで、ユーザーがブラウザー セッションを終了しても持続するという利点があります。

def check_guest
  #if user is logged in
  unless current_user 
    @event = Event.find_by_name(request.subdomain)
    #if user has already viewed, redirect
    if @event.guest_ip_address == request.remote_ip
      flash[:alert] = "Please sign in first"
      redirect_to sign_up_url(:subdomain => false)
    #if user hasn't viewed, allow access, but flag as having viewed and store their ip address in the event model so it knows not to show the page again unless current_user
    else
      session[:viewed] = request.remote_ip
      @event.guest_ip_address = session[:viewed]
      @event.save!
    end
  end
于 2013-08-28T23:48:16.710 に答える
0

これに対する事前構築済みのソリューションはわかりませんが、実装するのはそれほど難しくありません。私は次のようなことをします:

class GuestPass < ActiveRecord::Base

  belongs_to :event

  # the guest_passes table has a `code` column that contains a long arbitrary string token
end

class Event < ActiveRecord::Base

  has_many :guest_passes

  def authenticate_guest_pass!(token)
    return false unless token
    guest_passes.where(code: token).first
  end

end

class EventsController < ActiveRecord::Base

  before_action :load_event, only: [ :show ]
  before_action :validate_guest_pass, unless: current_user

  private

  def load_event
    @event = Event.find(params[:id])
  end

  def validate_guest_pass
    pass = @event.authenticate_guest_pass!(params[:pass])
    if pass
      pass.delete
    else
      # redirect to sign in or whatever
    end
  end

end

次に、GuestPassレコードを生成し、提供するリンクに貼り付けます。次のようになります。/events/1?pass=xyzzy

(ここのコードはクリーンアップを使用する可能性があります。きれいだと言っているわけではありません。しかし、これは最初のパスです。)

于 2013-08-28T20:32:45.933 に答える