10

ユーザーが自分の仕事のパフォーマンスについてフィードバックを要求できるようにする「フィードバック」モデルがあります。新しいフィードバック リクエストを作成するための基本的なアクションと、プロバイダー (フィードバックで応答する人) にリクエストを送信するためのメーラーを作成しました。

以下の実装について、コミュニティからのアドバイスをお願いします。

  • 新しいフィードバック要求が作成されると、送信される電子メールには、プロバイダーがユーザーのパフォーマンスに関するフィードバックを入力できるフォームへのリンクが含まれている必要があります。
  • フィードバック プロバイダーは、どのような方法でも (つまり、完全にアプリケーションの外部で) ログインまたはサインアップする必要はありません。
  • 送信後、プロバイダーからのフィードバックをシステムに取り込む必要があります。

現在、それを実装するための次のアイデアがありますが、これが最善の方法であるかどうかはわかりません。

  • 新しいフィードバック リクエストの作成時に一意のトークンを生成します。次のようなもの: Rails で一意のトークンを作成する最良の方法は? .
  • 次に、トークンを「フィードバック」テーブルに入力する必要があります。
  • 次にメーラーは、別のコントローラーへのリンクを生成する変数 (@url など) を生成する必要があります (たとえば、'external_feedback' と、ログインを必要としないアクション (Devise の no before_filter :authenticate_user! など) を生成します)。
  • その URL には、特定のフィードバック リクエストのトークンを含むパラメーターが含まれている必要があります。
  • アクションは、「フィードバック」リクエストと simple_form で生成されたフォームを更新することです。

全体は、アンケートやアンケート (Survey Monkey など) に回答するのと似ています。

いくつかの調査の結果、Friendly ID gem がここで役立つ可能性があると考えています。http://guides.rubyonrails.org/form_helpers.htmlのセクション 8 も読んでいましたが、おそらく正式な意味で Authenticity_token を実装する必要があります。私が本当に探しているのは次のとおりです。

  • 上記のアプローチは、これを行うための一般的に正しい方法ですか?
  • もしそうなら、それをどのように実装するか(Friendly IDの有無にかかわらず)の詳細はありますか?
  • そのような URL/トークンを生成するために存在する gem を知っていますか?

前もって感謝します。モデルとコントローラーの詳細の現在の状態を含めています。

feedback.rb
# == Schema Information
#
# Table name: feedbacks
#
#  id           :integer          not null, primary key
#  user_id      :integer
#  p_first_name :string(255)
#  p_last_name  :string(255)
#  p_email      :string(255)
#  goal_id      :integer
#  u_comment    :text
#  p_comment    :text
#  created_at   :datetime
#  updated_at   :datetime
#

class Feedback < ActiveRecord::Base
  belongs_to :user
  belongs_to :goal

  has_many :feedback_attributes

  validates_presence_of :p_first_name, :p_last_name, :p_email, :goal_id

end

そして、これは私のメーラーです:

class FeedbackMailer < ActionMailer::Base

   def feedback_request(user, feedback)
    @user = user
    @feedback = feedback
    @url  = 'http://thisistheexampleurlforfeedback'
    mail(to: @feedback.p_email, subject: "#{@user.first_name} #{@user.last_name} has requested your feedback", from: @user.email)
  end

end
4

1 に答える 1

16

インデックスを使用してトークン フィールドをフィードバック モデルに追加し、コールバックを追加して作成時に入力します (例: feedback.rb)。

before_create :add_token
private
def add_token
  begin
    self.token = SecureRandom.hex[0,10].upcase
  end while self.class.exists?(token: token)
end

プロバイダーのフィードバック用に新しいルートを追加するようになりました

resources :feedbacks do 
  get 'provider'
  put 'provider_update' # you might not need this one, if you are happy to use update
end

コントローラーで、デバイスによって拒否されないようにしてください

before_filter :authenticate_user!, except: [:provider, :provider_update]
...
def provider
  @feedback = Feedback.find_by token: params[:token]
end

app/views/feedback/provider.html.haml では、simple_form で url を使用して正しい更新場所に送信し、表示される入力のみを提供できます。

f.inputs :p_comment

今すぐあなたのメーラーを更新してください。

@url = provider_feedback_url(@feedback, token: @feedback.token)

フレンドリ ID を使用してこれと同様のことを行うこともできますが、何らかの固有のスラッグを作成してから、代わりに Feedback.friendly.find を使用する必要があります。それをトークンと組み合わせて、フィードバックを提供するプロバイダーであることを確認する必要があると思います-したがって、唯一の利点は、実際には真のID /カウントを隠すことです。次の開発者がその内容を認識できるように、p_* フィールドを provider_* に更新する必要があると思います - それは 90 年代ではありません!

于 2013-10-01T18:38:18.753 に答える